Php 将子字符串与字符串中的特殊字符匹配

Php 将子字符串与字符串中的特殊字符匹配,php,regex,Php,Regex,我遇到了一个regex挑战,到目前为止还没有找到解决方案 我有一个字符串,例如: &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. Pellent

我遇到了一个regex挑战,到目前为止还没有找到解决方案

我有一个字符串,例如:

&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.";
/!\[([^\]]+)\]/
$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);
我只想
preg_match
这一部分:
preg_match(/'![bibendum auctor]/)
如您所见,字符串中有一些特殊字符,这使得regexp无法匹配查询


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

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

&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.";
/!\[([^\]]+)\]/
$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);

编辑:如果您想在尝试时匹配准确的短语,则必须避开括号,如:

/'!\[bibendum auctor\]/

您可以对正在搜索的字符串使用
preg\u quote
,如下所示:

&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.";
/!\[([^\]]+)\]/
$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);

(如果您想知道
preg_quote(“![bibendum auctor]”,“/”)
不会触及字符串的其余部分?您可以使用倒破折号转义字符,例如
\'\!\[bibendum auctor]
抱歉,我忘了添加特殊字符是未知的,随机生成的,因此我无法手动转义。最好是我可以匹配它,例如:fringilla'![bibendum auctor]。NuncLike:preg_match(/fringilla.*Nunc/)这根本不是有效的PHP语法。谢谢,但方括号只是特殊字符的示例。要匹配的部分可以是任何内容,例如:“!]bibendum auctor[$@Nick它可以处理任何东西,你只需要逃避这个问题,在整个字符串中只有这部分是已知的:fringilla.*Nunc我需要匹配这两个字符串之间的内容,并且这个子字符串有随机字符;一些是什么导致正则表达式失败的。