【问题标题】:Match substring with special characters in a string将子字符串与字符串中的特殊字符匹配
【发布时间】:2014-07-12 19:00:55
【问题描述】:

我遇到了一个正则表达式挑战,到目前为止还没有找到解决方案。

我有一个字符串,例如:

&str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce malesuada sit amet risus vel ultricies. Quisque pretium leo in sem sodales, in ullamcorper dolor aliquet. Duis at massa felis. Pellentesque fringilla **'![bibendum auctor]**. Nunc scelerisque aliquam sem. Nam pharetra eros quis libero molestie iaculis. Etiam vehicula blandit ipsum in sodales. Nulla tempus cursus lacus, sed cursus ligula consequat at. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse at blandit" ipsum, sed porta urna. Vesti&&&&bulum turpis risus, ultricies at sapien id, vehicula venenatis neque.";

我想preg_matchonly 这部分:preg_match(/'![bibendum auctor]/);
如您所见,字符串中有一些特殊字符,这使正则表达式无法匹配查询。

我不能使用preg_quote(),因为我不想转义整个字符串其他部分的特殊字符。

【问题讨论】:

  • preg_quote('![bibendum auctor]', '/') 不会触及字符串的其余部分?
  • 您可以使用倒划线转义字符,例如\'\!\[bibendum auctor]
  • 对不起,我忘了补充特殊字符是未知的,随机生成的,因此我无法手动转义它们。最好的办法是我可以匹配这个,例如:fringilla '![bibendum auctor]。 Nunc
  • 点赞:preg_match(/fringilla.*Nunc/)
  • 这根本不是有效的 PHP 语法。

标签: php regex


【解决方案1】:

您可以在要搜索的字符串上使用preg_quote,如下所示:

$str = <<<EOT
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce malesuada sit amet risus vel ultricies. Quisque pretium leo in sem sodales, in ullamcorper dolor aliquet. Duis at massa felis. Pellentesque fringilla **'![bibendum auctor]**. Nunc scelerisque aliquam sem. Nam pharetra eros quis libero molestie iaculis. Etiam vehicula blandit ipsum in sodales. Nulla tempus cursus lacus, sed cursus ligula consequat at. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse at blandit" ipsum, sed porta urna. Vesti&&&&bulum turpis risus, ultricies at sapien id, vehicula venenatis neque.
EOT;

$search = preg_quote('![bibendum auctor]', '/');

preg_match("/$search/", $str, $matches);
print_r($matches);

输出:

Array ( [0] => ![bibendum auctor] ) 

(如果您想知道 &lt;&lt;&lt;EOTheredoc syntax - 我只是使用它,所以我不必转义字符串中的所有引号)

【讨论】:

    【解决方案2】:

    您可以匹配方括号中前面带有感叹号的任何内容,如下所示:

    /!\[([^\]]+)\]/
    

    working example

    编辑:如果你想匹配你尝试过的确切短语,你必须像这样转义括号:

    /'!\[bibendum auctor\]/
    

    example

    【讨论】:

    • 谢谢,但方括号只是特殊字符的示例。要匹配的部分可以是任何东西,例如:'!]bibendum auctor[$
    • @Nick 它适用于任何东西,你只需要转义 special characters
    • 问题是在整个字符串中只有这部分是已知的: fringilla.*Nunc 我需要匹配这两者之间的内容,并且这个子字符串有随机字符;一些导致正则表达式失败的原因。
    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多