正则表达式忽略一组单词中的空格和特殊字符[php]

时间:2015-08-01 20:14:15

标签: php regex

我正在寻找一个正则表达式来匹配文本中所有这些替代字符串,例如:

Mist X&摇滚正卷
MistX& RocknRoll
Mist-X和Rock n Roll
Mist X Rock n Roll
MistX-RocknRoll
雾X - 摇滚 等...

我想忽略空格/特殊字符/个案,并获取音乐乐队的名称。 我在正则表达方面非常糟糕,我现在拥有的只有:

$string = "Mist X & Rock-n-Roll";  
$valid = preg_match("/\b".$string."\b/i", $text);  

只有当它完全相同时才匹配 我最后的想法是删除$ text和$ string中的所有空格/特殊字符,以匹配下一个正则表达式,但它可能会返回一个没有预期的结果。 (如上面这个例子)

$string = "Son-B";
$new_string = strtolower(str_replace('-', '', $string));

$text = "I like my son because he is smart";
$new_text = strtolower(str_replace(' ', '', $text));

preg_match("/".$new_string."/i", $new_text); // => true while I don't want to match !

有什么想法吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

mist(\W)?x.*rock(\W)?n(\W)?roll

Regular expression visualization

Debuggex Demo

匹配给出的所有示例。

修改:要确保它不属于其他字词,请在两端添加\b

答案 1 :(得分:-1)

尝试这样可以轻松开始比较:

$list = array(
    "Mist X & Rock-n-Roll",
    "MistX & RocknRoll",
    "Mist-X and Rock n Roll",
    "Mist X Rock n Roll",
    "MistX-RocknRoll",
    "mist X - rock n roll",
);


foreach ($list as $e) {
    $e = strtolower($e);
    echo preg_replace("![^a-z]!", "", $e);
    echo "<br/>";
}

结果:

  

mistxrocknroll
  mistxrocknroll
  mistxandrocknroll
  mistxrocknroll
  mistxrocknroll
  mistxrocknroll