使用preg_replace

时间:2015-08-03 15:48:59

标签: php regex

我想删除少于2个字符的<p> </p>个标签。例如

$myText = "<p>hello world</p> <p>-</p> <p> </p>";
由于少于2个字符,

<p>-</p><p> </p>应从$myText;中删除。

我的模式是:

$output = preg_replace("/\b<p>[a-z]{1,2}</p>\b/","", $myText);

但当我回显$ output时,我看不到任何东西。这有什么问题?

5 个答案:

答案 0 :(得分:4)

$output = preg_replace("/\b<p>[a-z]{1,2}</p>\b/","", $myText);

你有几个错误:

  • 您使用/作为分隔符,但不要在模式中将其转义。您应该从此处收到错误但如果您什么也看不到,则必须关闭错误报告。通常在开发时打开错误报告是个好主意
  • [a-z]只匹配小写字母,而不是“任何”
  • 您说少于2个字符,因此它应匹配0或1个字符。但您的范围匹配1或2个字符
  • \b是不必要的,实际上可能导致某些内容不匹配,具体取决于上下文
  • 您没有考虑跨越多行(这可能是真实情况的情况。

试试这个:

$output = preg_replace("~<p>.?</p>~s","", $myText);

答案 1 :(得分:1)

你的第一个问题是,你必须在你的正则表达式中逃避斜线,否则它会认为这是你的分隔符,你应该收到警告:

  

警告:preg_replace():未知的修饰符&#39; p&#39;

所以你可能没有error reporting开启。

其次,您要删除以下标签:<p>-</p><p> </p>,但您只允许a-z两个标签之间。

所以将代码更改为:

<?php

    $myText = "<p>hello world</p> <p>-</p> <p> </p>";
    $output = preg_replace("/<[^>]+>.{1,2}<\/[^>]+>/","", $myText); 

    highlight_string($output);

?>

输出:

<p>hello world</p>  

答案 2 :(得分:1)

尝试使用正则表达式模式:/<p>.{0,2}<\/p>/ 您需要在结束/中转义</p>

此代码还会检查不仅仅是按字母顺序排列的任何字符。

此代码还会检查2或更少(包括0)。我假设你想要它,然后重新阅读,并意识到你可能没有想要,但是如果你这样做,并且如果你不这样做就很容易改变:)

答案 3 :(得分:0)

您的示例文字会显示您要删除的字符串&#34;因为少于2个字符&#34;

$myText = "<p>hello world</p> <p>-</p> <p> </p>";

但您的模式是检查一个或两个小写字母。

$output = preg_replace("/\b<p>[a-z]{1,2}</p>\b/","", $myText);

您的示例中没有小写字母。

答案 4 :(得分:0)

此处的其他答案很接近,但您需要为量词添加lazy修饰符,并为多行添加m,以防<p>个代码跨越多行:< / p>

$html = "<p>hello world</p> <p>-</p> <p> </p>";
$replaced = preg_replace("/<p([^>]+?)>.{1,2}<\/p>/m","", $html);