PHP preg_match_all带有“/”字符的奇怪行为

时间:2013-11-29 09:56:37

标签: php

使用:

preg_match_all(
    "/\b".$KeyWord."\b/u", 
    $SearchStr,
    $Array1,
    PREG_OFFSET_CAPTURE);

此代码适用于所有情况,除非/ var中有$KeyWord。然后我当然得到一个警告和不成功的比赛。

任何想法如何解决这个问题?

由于

4 个答案:

答案 0 :(得分:1)

在关键字周围使用preg_quote()

http://us2.php.net/preg_quote

但也提供了分隔符,因此它会被转义:preg_quote($KeyWord, "/")

答案 1 :(得分:1)

你必须解析$ KeyWord并在所有规范符号之前添加“\”,你可以使用preg_quote()

答案 2 :(得分:1)

模式中的动态值

您在模式中使用动态值。与转义SQL或HTML一样,需要特定的值转义。如果你没有转义,则值内的元字符由正则表达式引擎解释。 PCRE模式的转义函数为preg_quote()

preg_match_all(
    "(\b".preg_quote($KeyWord)."\b)u", 
    $SearchStr,
    $Array1,
    PREG_OFFSET_CAPTURE
);

PHPs preg_ *函数中模式的语法是:

DELIMITER PATTERN DELIMITER OPTIONS

/是您模式中的分隔符。因此$ keyWord中的/被识别为结束分隔符。

但是可以使用所有非字母数字字符。在Perl和JS中,您可以使用/直接定义正则表达式(而不是字符串),因此它通常是教程中的默认值。

大多数分隔符必须在模式中进行转义。

  • 匹配\:'/\//'

此规则的例外是括号。您可以使用任何括号对作为分隔符。因为它是一对,它们仍然可以在模式中使用。

  • 匹配\:'(/)'

()括号是一个很好的决定,你可以把它们算作“子模式0”。

答案 3 :(得分:0)

您可以使用preg_quote来处理反斜杠字符。

从手册:

  

在每个人面前加上反斜杠   属于常规的角色   表达式语法

您也可以将分隔符作为第二个参数传递,它也将被转义。但是,如果您使用#作为分隔符,则无需转义/

所以,您可以使用:

preg_match_all("/\b".preg_quote($KeyWord, "/")."\b/u", $SearchStr,$Array1,PREG_OFFSET_CAPTURE))

或者,如果您确定您的关键字不包含任何其他正则表达式特殊字符,则只需更改分隔符,并使用以转义反斜杠:

preg_match_all("#\b".$KeyWord."\b#u", $SearchStr,$Array1,PREG_OFFSET_CAPTURE))