Лучший способ написать несколько вызовов strpos

Я сделал простой скрипт, который находит все исходящие теги <a> веб-сайта и отображает их.

Чтобы сделать это, сначала я очищаю карту сайта, помещаю эти URL-адреса в массив, затем перебираю URL-адреса, очищая каждый из них по отдельности в поисках тегов <a>, затем запускаю strpos() для каждого найденного тега, чтобы посмотреть, есть ли в нем какие-либо URL-адреса, которые я хочу игнорировать.

Сценарий занимает около 5 минут (500 очищенных страниц) для завершения (работает локально), и мне было интересно, есть ли более быстрый способ справиться с поиском иголки/стога сена для исключенных параметров. В данный момент я использую

//SEES IF URL CONTAINS EXCLUDED PARAM
function find_excluded_url ($match_url) {
    return strpos($match_url, "mydomain.co.uk") ||
        strpos($match_url, "tumblr.com") ||
        strpos($match_url, "nofollow") ||
        strpos($match_url, "/archive") || 
        strpos($match_url, "page/2");
}

Чтобы затем отобразить результат, я использую

if ( find_excluded_url($element) == false ) {
   echo "<a href='$element->href'>" . $element->href . "</a>";
} 

Есть ли более эффективный способ добиться этого?

Извините, если это очень очевидный вопрос, это первая настоящая вещь, которую я создал с помощью PHP.


person sam    schedule 10.04.2013    source источник


Ответы (3)


Просто примечание: strpos возвращает 0, если элемент находится в начале строки, и false, если элемент отсутствует в строке.

Для PHP 0 и false — это одно и то же, то есть ваш скрипт не будет идентифицировать ссылки, начинающиеся с ключевых слов.

Поэтому я бы посоветовал вам изменить свой скрипт на это:

function find_excluded_url ($match_url) {
    return strpos($match_url, "mydomain.co.uk") !== false ||
         strpos($match_url, "tumblr.com") !== false ||
         strpos($match_url, "nofollow") !== false ||
         strpos($match_url, "/archive") !== false || 
         strpos($match_url, "page/2") !== false;
}
person Hermann Stephane Ntsamo    schedule 10.04.2013
comment
я только что обновил свой вопрос выше, чтобы показать, как я вызываю функцию, имеет ли это тот же эффект, что и то, как вы написали функцию? - person sam; 10.04.2013
comment
Не пытайтесь установить $match_url на mydomain.co.uk и использовать свой код, если вы не добавите !== false, функция не распознает его как совпадение, поэтому я предложил вам добавить его в вашу функцию. Однако, если вы беспокоитесь о скорости, помните, что вызов функции добавляет накладные расходы в код, поэтому я бы посоветовал вам сделать strpos встроенным в if, я думаю, это будет немного быстрее. - person Hermann Stephane Ntsamo; 11.04.2013

Если вы хотите проверить, находится ли одна строка в другой, вы должны использовать один из следующих двух способов: http://php.net/manual/en/function.stristr.php
http://php.net/manual/en/function.strstr.php

Предупреждение в strpos: «Эта функция может возвращать логическое значение FALSE, но также может возвращать нелогическое значение, которое оценивается как FALSE. Пожалуйста, прочитайте раздел о логических значениях для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции. ."

/**
 * Loops through the array to see if one
 * of the values is inside the $needle
 *
 * @param  string $needle
 * @param  array  $haystack
 * @return bool
 */
function strstr_array($needle, array $haystack)
{
  foreach($haystack as $search) {
    if(strstr($needle, $search)) {
      return true;
    }
  }
  return false;
}

$haystack = array('my-domain.com', 'sub.my-domain.com');
var_dump(strstr_array('test my-domain.com or something', $haystack));
person Anyone    schedule 10.04.2013
comment
Вопрос был о производительности. В руководстве для strstr четко указано: если вы хотите только определить, встречается ли конкретная иголка в стоге сена, вместо этого используйте более быструю и менее требовательную к памяти функцию strpos(). - person Kristian J.; 10.04.2013

попробуй это

if (preg_match('/word/i', $str))
person user3270784    schedule 14.01.2016
comment
Пожалуйста, всегда поясняйте свой ответ. - person Rohit Gupta; 15.01.2016