我有一个字符串/正则表达式列表,我想检查它是否与字符串输入匹配。
假设我有这些列表:
$list = [ // an array list of string/regex that i want to check
"lorem ipsum", // a words
"example", // another word
"/(nulla)/", // a regex
];
和字符串:
$input_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer quam ex, vestibulum sed laoreet auctor, iaculis eget velit. Donec mattis, nulla ac suscipit maximus, leo metus vestibulum eros, nec finibus nisl dui ut est. Nam tristique varius mauris, a faucibus augue.";
所以,我希望它像这样检查:
if( $matched_string >= 1 ){ // check if there was more than 1 string matched or something...
// do something...
// output matched string: "lorem ipsum", "nulla"
}else{
// nothing matched
}
我怎么能做这种事?
3条答案
按热度按时间p4rjhz4m1#
我不确定这种方法是否适用于您的情况,但是,您可以将它们都视为正则表达式。
以上将输出以下内容:
Sandbox
m1m5dgzv2#
通常,如果有人胆敢用错误抑制器来破坏代码,我会大声尖叫。如果输入数据超出了您的控制范围,以至于您允许混合使用regex和非regex输入字符串,那么我猜您可能也会在代码中容忍
@
。验证搜索字符串是否为regex。如果它不是有效的regex,则用分隔符将其括起来,并调用
preg_quote()
以形成有效的regex模式,然后将其传递给实际的haystack字符串。代码:(Demo)
或者你可以这样写同样的东西,但是我不知道通过检查非空字符串的模式是否会影响性能:(Demo)
a5g8bdjr3#
请尝试以下操作:
印刷品:
讨论与限制
在处理
$list
的每个元素时,如果字符串以“/”开头和结尾,则假定它是正则表达式,并从字符串的开头和结尾删除“/”字符。因此,不以这些字符开头和结尾的任何其他字符串都必须是普通字符串。这意味着如果OP要匹配恰好以'/开头和结尾的普通字符串',例如'/./',则它们必须将其改为作为正则表达式:'//.//'。纯字串会被呼叫preg_quote
的结果所取代,以逸出在正则表达式中有意义的特殊字符,进而将它转换成不含开头和结尾'/'分隔符号的正则表达式。最后,所有字串会以正则表达式或字符链接在一起,'|',然后在前面加上和后面加上'/'字符,以便从输入创建单个正则表达式。主要的限制是,如果输入列表中的多个正则表达式具有捕获组,则不会自动调整反向引用编号,因为当正则表达式组合时,组编号将受到影响。因此,此类正则表达式模式必须识别具有捕获组的先前正则表达式模式,并相应地调整其反向引用(请参见下面的演示)。
正则表达式标志(即模式修饰符)必须嵌入正则表达式本身。由于
$list
的一个正则表达式字符串中的此类标志将影响另一个正则表达式字符串的处理,如果在一个正则表达式中使用的标志不适用于后续的正则表达式,则必须明确关闭这些标志:印刷品:
下面说明如何通过手动调整组编号来 * 正确 * 处理反向引用:
印刷品: