Найти фразу в строке с preg_match - PullRequest
5 голосов
/ 10 апреля 2011

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

См. Подробности, подробности, см. Подробности и т. Д.

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

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

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

Ответы [ 4 ]

10 голосов
/ 10 апреля 2011

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

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


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

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

6 голосов
/ 10 апреля 2011

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

/^(\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 голосов
/ 10 апреля 2011

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

if (stripos(strtolower($line), 'see details') !== false) {
    // 'see details' is in the $line
}
0 голосов
/ 10 декабря 2013

в соответствии с документацией 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("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}

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

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

...