PHP - 使用Regex Pattern删除其间的短代码和内容

时间:2015-09-05 22:37:13

标签: php regex

我有以下字符串:

$text = My example text [shortcode_name]content of shortcode[/shortcode_name] is cool.

以下模式:

$pattern= '/\[(\/?shortcode_name.*?(?=\]))\]/';

它给了我以下结果:

preg_replace($pattern,'',$text);
My example text content of shortcode is cool.

这就像删除短代码的魅力一样 我正在寻找的是删除短代码和其间的所有内容。 我正在寻找的结果是:

My example text is cool.

4 个答案:

答案 0 :(得分:3)

你走了:

$pattern= '/\[(shortcode_name)\].*?\[\/\1\] ?/';

说明:

  • 匹配[
  • 后跟“shortcode_name”(在(...)内捕获,以便稍后重复使用,见下文)
  • 后跟]
  • 接下来是任何事情,非贪婪(重要!)
  • 接着是[/
  • 后面是(...)之前匹配的内容,在此示例中为“shortcode_name”
  • 后跟]
  • 后跟1或零空格

答案 1 :(得分:2)

这可能可以作为你的正则表达式:

/\[(\w+)\].*\[\/(\1)\]/

您找到任何名称的第一个方括号标记,并在其间查找内容,然后使用lookback查找结束方括号。我只用javascript测试它,但它应该工作。然后你应该使用另一个正则表达式替换一个空格的多个空格:)

答案 2 :(得分:0)

你刚接受我的解决方案时接受了另一个答案,没有问题:)但我仍然想发布我的答案,因为如果你有多个短代码可以更灵活:

<?php

$shortCodes = array("shortcode_name", "shortcode_name2", "shortcode_name3");

$text = <<< EOF
My example text [shortcode_name]content of shortcode[/shortcode_name] is cool.
another example text [shortcode_name2]content of shortcode[/shortcode_name2] is cool.
Yet another example  [shortcode_name3]content of shortcode[/shortcode_name3] is cool.
EOF;

foreach($shortCodes as $shortCode){
   $text = preg_replace("%\[$shortCode\].*?\[/$shortCode\]%i", '', $text);      
   $text = preg_replace('/\s{2,}/i', ' ', $text); //remove 2 or more spaces

}

echo $text;

<强>输出:

My example text is cool.
another example text is cool.
Yet another example is cool.

<强>演示: http://ideone.com/VhL5vm

答案 3 :(得分:-1)

试试我的版本,它也会照顾换行符。

$text = "My example text [shortcode_name]content of shortcode[/shortcode_name] is cool.";
$text = "My example text [shortcode_name]content of 
shortcode[/shortcode_name] is cool.";

$pattern= '/\[(shortcode_name)\](.|\s)*?\[\/\1\]/'; 
echo preg_replace($pattern,'' ,$text); 

<强>输出
我的示例文字很酷。