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

Rob*_*Roy 5 php string preg-match

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

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

到目前为止我有这个.

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

一个简单的例子非常有用,谢谢.

Pas*_*TIN 11

如果你想检查字符串中是否存在子字符串,则不需要正则表达式:stripos()会做得很好:

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


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

这意味着如果返回其他内容false,则会找到子字符串.

  • 已经使用不区分大小写的匹配(`stripos`)时不需要使用`strtolower` (5认同)

Cha*_*les 6

你的正则表达式实际上已被打破.

/^(\see details)/
Run Code Online (Sandbox Code Playgroud)

这分解为:

  • 一开始
  • 打开一个捕获组
  • 寻找一个空白字符
  • 其次是以下所有字符: ee details
  • 关闭该组

\s是一个匹配空格的转义序列.你也可以添加的i修改,使正则表达式不区分大小写.您似乎也没有对捕获的组执行任何操作,因此您可以放弃它.

因此:

/^see details/i
Run Code Online (Sandbox Code Playgroud)

是你想要的.

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

/^see details/im
Run Code Online (Sandbox Code Playgroud)

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

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

但正如其他人所提到的,这里不需要正则表达式.你可以(并且应该)用更简单的方式完成工作stripos.