Найти фразу в строке с помощью preg_match

#php #string #preg-match

#php #строка #preg-совпадение

Вопрос:

Я просматриваю текст построчно и хочу посмотреть, содержит ли строка фразу «see details» и не чувствительна ли она к регистру, поэтому найду:

Смотрите подробности, Смотрите подробности, СМОТРИТЕ подробности и т. Д

Пока у меня это есть.

 if(preg_match("/^(see details)/", strtolower($line)))
{
    echo 'SEE DETAILS FOUND';
}
  

Простой пример был бы полезен, спасибо.

Ответ №1:

Если вы хотите проверить, присутствует ли подстрока в строке, регулярные выражения не нужны: stripos() отлично подойдет :

 if (stripos(strtolower($line), 'see details') !== false) {
    // 'see details' is in the $line
}
  

stripos() вернет позицию первого вхождения подстроки в строке; или false если подстрока не найдена.

Это означает, что если она возвращает что-то другое, чем false , то подстрока найдена.

Комментарии:

1. Благодаря этому имеет больше смысла делать это таким образом. 1-я строка должна быть if (strpos(strtolower($line), ‘see details’) !== false).

2. упс ^^ да, конечно 🙂 извините за это, забыл ввести половину этого… (Я отредактировал свой ответ, чтобы исправить это; спасибо за комментарий!)

3. нет необходимости использовать, strtolower когда уже используется сопоставление без учета регистра ( stripos )

Ответ №2:

Ваше регулярное выражение фактически нарушено.

 /^(see details)/
  

Это разбивается на:

  • В начале
  • Открыть группу захвата
  • Найдите один пробел
  • За которой следуют все следующие символы: ee details
  • Закрыть группу

s это escape-последовательность, соответствующая пробелу. Вы могли бы также добавить i модификатор, чтобы сделать регулярное выражение нечувствительным к регистру. Вы также, похоже, ничего не делаете с захваченной группой, так что вы можете отказаться от этого.

Поэтому:

 /^see details/i
  

это то, что вы хотели бы.

Вы упомянули, что вы просматриваете ввод построчно. Если вам нужно только знать, что весь ввод содержит определенную строку, и у вас есть ввод в виде строки, вы можете использовать m модификатор, чтобы ^ сопоставить «начало строки» вместо / в дополнение к «началу строки»:

 /^see details/im
  

Если это так, то в итоге вы получите:

 if(preg_match('/^see details/im', $whole_input)) {
    echo "See Details Found!";
}
  

Но, как упоминали другие, регулярное выражение здесь не требуется. Вы можете (и должны) выполнить эту работу с помощью более простого stripos .

Ответ №3:

Как сказал Pascal, вы можете использовать stripos() функцию, хотя правильный код был бы:

 if (stripos(strtolower($line), 'see details') !== false) {
    // 'see details' is in the $line
}
  

Ответ №4:

согласно документации php (http://www.php.net/manual/en/function.preg-match.php ):

 <?php
/* The b in the pattern indicates a word boundary, so only the distinct
 * word "web" is matched, and not a word partial like "webbing" or "cobweb" */
if (preg_match("/bwebb/i", "PHP is the web scripting language of choice.")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}

if (preg_match("/bwebb/i", "PHP is the website scripting language of choice.")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}
?>
  

что выглядит довольно просто и приятно :-).