[英]unable to understand how to match all characters except a given sequence with preg_replace() in php
所以我想做的是匹配一个具有<p>;
开头的正则表达式<p>;
标签和结束</;p>
标签。这是我写的代码:
<?php
$input = "<p>just some text</p> more text!";
$input = preg_replace('/<p>[^(<\/p>)]+?<\/;p>/','<p>$1</p>',$tem);
echo $input;
?>
因此,代码似乎不更换<p>
与<p>
或更换</p>
与</p>
.I认为这个问题是在我检查所有字符期望部分'</p>
。 我认为代码[^(<\\/p>)]
不能正确分组所有字符。 我认为它会检查是否不存在任何字符,也不检查是否不存在整个字符组。 请帮我在这里。
RegEx中的[]是字符组,您不能以这种方式匹配字符串,只能匹配字符或Unicode代码点。
如果转义了HTML实体,则可以使用htmlspecialchars_decode()将它们转换回字符。
拥有有效的HTML之后,可以使用DOM进行解析,遍历和操作。 您如何在PHP中解析和处理HTML / XML?
我想我明白了。这是代码:
<?php
$input = "<p>text</p>";
$tem = $input;
$tem = htmlspecialchars($input);
$tem = preg_replace('/<p>(.+?)<\/p>/','<p>$1</p>',$tem);
echo $tem;
?>
您不需要捕获p标签之间的内容,只需要替换p标签即可:
$html = preg_replace('~<(/?p)>~', '<$1>', $html);
但是,您也不需要正则表达式:
$trans = array('<p>' => '<p>', '</p>' => '</p>');
$html = strtr($html, $trans);
您遇到的麻烦至少部分原因可能是由于您似乎对HTML实体中的分号玩得太快而又松懈。 它们总是以“&”号开头,以分号结尾 。 所以是>
,而不是>
因为您的帖子分散了。
也就是说,为什么不使用不需要滥用正则表达式的html_entity_decode()
呢?
$string = 'shoop <p>da</p> woop';
echo html_entity_decode($string);
// output: shoop <p>da</p> woop
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.