【问题标题】:PHP string replace with multiple conditionsPHP字符串替换为多个条件
【发布时间】:2015-11-06 22:31:27
【问题描述】:

我想对必须有多个条件的字符串进行替换,并根据它们进行替换。我知道我可以在 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;
}

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

我怎样才能做到这一点?

【问题讨论】:

  • 正则表达式可以解决问题。 str_replace 无法匹配通配符,因此除非您先进行大量搜索/定位,否则您不能为此使用 str_replace。

标签: php regex string str-replace


【解决方案1】:

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

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

单个捕获组应该得到TEXT 和它之后的任何东西,直到&lt;/p&gt;

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

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

Regex101

【讨论】:

  • 谢谢!我稍微修改了你的表情,而不是preg_replace()。现在一切正常。
猜你喜欢
  • 2012-06-12
  • 1970-01-01
  • 2013-11-19
  • 2017-12-10
  • 2017-12-02
  • 2021-10-08
  • 1970-01-01
  • 2014-03-13
相关资源
最近更新 更多