动态生成字符串的PHP正则表达式

时间:2015-02-26 09:34:35

标签: php regex

我想在php中为动态生成的字符串编写一个正则表达式。

以下是我的用例 -

$str1 = {"testste", "comma", etc......};

上面的字符串不是静态的,每次都会改变。

$str2 =  "huge log string";

以上字符串也是动态生成的。

我已将$ str1转换为数组,因为它是逗号分隔的。

现在创建了一个函数来检查$ str1数组项到$ str2

   public function arrayInString($findArrayItems , $findinString){
        $flag = false;
        foreach($findArrayItems as $item){
            if((($item!='') && strpos($findinString, $item)!==false)){
                $flag = true;
            }
        }
        return $flag;
   }

这就是我目前使用的。

如果$ str1和$ str2都动态生成,我如何编写正则表达式以避免使用函数arrayInString。

1 个答案:

答案 0 :(得分:1)

假设您的数组只包含您希望按原样匹配的单词或短语(即它们不包含正则表达式模式)。然后,您可以使用foreach()在数组中的每个项目上使用preg_quote()构建正则表达式模式。

你的原始arrayInString()函数可能会比这更好,但正如Regex带来的开销一样。

$arr = array("One", "Two", "Three");
$str1 = "This is a Non-Match";
$str2 = "This one is a Match";

$first = true;
$regex = "/\b(?:";
foreach( $arr as $item ) {
    $regex .= ($first?"":"|") . preg_quote( $item, '/' );
    if($first) {$first = false;}
}
$regex .= ")\b/i";

// Regex is now equal to "/\b(?:One|Two|Three)\b/i"

print "Str1: " . (preg_match($regex, $str1)?"Matches":"Doesn't Match");
print "Str2: " . (preg_match($regex, $str2)?"Matches":"Doesn't Match");

这产生了正则表达式,其执行以下操作:
Regular expression visualization