PHP正则表达式删除<p>标记内的前导和尾随<br/>

时间:2016-09-13 00:13:48

标签: php regex

我无法解决这个问题。

我需要一个正则表达式,它会删除<br>个标记中的任何前导或尾随<p>标记。

例如。

<p> <br />Some test text. <br /> Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. <br /><br /><br /> </p>

应该成为......

<p>Some test text. <br /> Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text.</p>

我觉得这应该很简单,但我已经遇到了障碍。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您只需要<p></p>的前瞻和后视,以及<br>的某些变体的一次或多次出现的非捕获组。

用于匹配前导<br/>代码:

(?<=<p>)(?:\s*<br\s*\/?>)+\s*

用于匹配尾随<br/>标记:

(?:\s*<br\s*\/?>)+\s*(?=<\/p>)

两者在一起:

(?<=<p>)(?:\s*<br\s*\/?>)+\s*|(?:\s*<br\s*\/?>)+\s*(?=<\/p>)

Regex101 Demo

答案 1 :(得分:0)

我们可以在没有正则表达式的情况下完成     

// Method1 :: Finding and replacing unwanted tags
$str1 = '<p> <br />Some test text. <br /> Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. <br /><br /><br /></p>';

$findTags = array('<br>', '<br />');
$replacement = array();

// Case insensitive replacement
$str1 = str_ireplace($findTags, $replacement, $str1);
print_r($str1);

// Method 2:: Stripping all HTML tags except allowed tags

$str2 = '<p> <br />Some test text. <br /> Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. Some test text. <br /><br /><br /></p>';
$str2 = strip_tags($str2, '<p>');

echo $str2;
?>

参考链接:

http://php.net/manual/en/function.str-replace.php

http://php.net/manual/en/function.str-ireplace.php

http://php.net/manual/en/function.strip-tags.php