使用preg_match在字符串中查找短语

时间:2011-04-10 17:37:51

标签: php string preg-match

我正在逐行搜索文本,并希望查看该行是否包含“查看详细信息”这一短语,并且不区分大小写,因此会找到:

查看详细信息,查看详细信息,查看详细信息等

到目前为止,我有这个。

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

一个简单的例子非常有用。

4 个答案:

答案 0 :(得分:10)

如果要检查字符串中是否存在子字符串,则不需要正则表达式:stripos()可以正常运行:

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


stripos()将返回字符串中第一次出现的子字符串的位置;如果找不到子字符串,则为false

这意味着如果它返回的内容不是false,则会找到子字符串。

答案 1 :(得分:6)

你的正则表达式实际上已经破了。

/^(\see details)/

这分为:

  • 一开始
  • 打开一个捕获组
  • 寻找一个空格字符
  • 所有以下字符后跟:ee details
  • 关闭论坛
匹配空格的

\s is an escape sequence。您还可以添加the i modifier以使正则表达式不区分大小写。您似乎也没有对捕获的组执行任何操作,因此您可以放弃它。

因此:

/^see details/i

是你想要的。

你提到你要逐行输入。如果您只需要知道整个输入包含特定字符串,并且您将输入作为字符串,则可以使用m修饰符使^匹配“行的开头”而不是/除了“字符串的开头”:

/^see details/im

如果是这种情况,那么你最终会得到:

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

但正如其他人所说,这里不需要正则表达式。您可以(并且应该)使用更简单的stripos来完成工作。

答案 2 :(得分:3)

正如Pascal所说,你可以使用stripos()函数,尽管正确的代码是:

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

答案 3 :(得分:0)

根据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.";
}
?>

它看起来很简单和漂亮:-)。