PHP 字符串替换多个条件

PHP string replace with multiple conditions

我想在必须有多个条件的字符串上进行替换,并根据它们进行替换。我知道我可以在 str_replace() 中使用数组作为搜索字符串,但我的问题是字符串的一部分是动态的。

例如:

字符串看起来像这样:

<p>SOME TEXT</p> 
<p>SOME TEXT (dynamic content 1)</p> 
<p>SOME TEXT (dynamic content 2)</p> 
<p>SOME TEXT</p>

替换后的字符串应如下所示

<p>SOME <span>TEXT</span></p> 
<p>SOME <span>TEXT (dynamic content 1)</span></p> 
<p>SOME <span>TEXT (dynamic content 2)</span></p> 
<p>SOME <span>TEXT</span></p>

如示例所示,搜索词是 TEXTTEXT (dyn cont) 我的问题是我不知道如何为内容是动态的第二个搜索词设置条件在括号之间。

基本上如果有 2 个不变的词,我会做这样的事情:

if(strpos($str, 'TEXT') !== FALSE || strpos($str, 'TEXT ()') !== FALSE){
  echo str_replace(array('TEXT', 'TEXT ()'), 
                   array('<span>TEXT</span>', '<span>TEXT ()</span>'),
                   $str);
}
else {
  echo $str;
}

但显然这在这种情况下不起作用。

我怎样才能使这个工作?

您可以使用此正则表达式进行匹配:

(?:<p>SOME\s)(TEXT\s?.*?)(?:<\/p>)

单个捕获组应该得到 TEXT 以及它之后的任何内容,直到 </p>

此外,如果您想允许动态内容包含换行符,请将正则表达式更改为:

(?:<p>SOME\s)(TEXT\s?[\s\S]*?)(?:<\/p>)

Regex101