无法理解如何使用php中的preg_replace()匹配除给定序列之外的所有字符

无法理解如何使用php中的preg_replace()匹配除给定序列之外的所有字符,php,regex,Php,Regex,所以我要做的是匹配一个正则表达式,它有一个开头p标记和结束符</;ptag。这是我写的代码: <?php $input = "&lt;p&gtjust some text&lt;/p&gt more text!"; $input = preg_replace('/&lt;p&gt[^(&lt;\/p&gt)]+?&lt\/;p&gt/','<p>$1</p>',$tem); echo

所以我要做的是匹配一个正则表达式,它有一个开头
p标记和结束符
</;p
tag。这是我写的代码:

<?php
$input = "&lt;p&gtjust some text&lt;/p&gt more text!";
$input = preg_replace('/&lt;p&gt[^(&lt;\/p&gt)]+?&lt\/;p&gt/','<p>$1</p>',$tem);
echo $input;
?>


因此,代码似乎没有将
p>
替换为
,也没有将
/p>
替换为

。我认为问题出在我检查除
'/p>
以外的所有字符的部分。我认为代码
[^(\/p>)]
没有正确地分组所有字符。我认为它会检查是否有任何字符不存在,也不会检查整个字符组是否不存在。请帮我一个忙。

[]在正则表达式中是一个字符组,不能用这种方式匹配字符串,只能匹配字符或unicode码点

如果已转义HTML实体,则可以使用将它们转换回字符

获得有效的HTML后,可以使用DOM对其进行解析、遍历和操作。
我想我找到了答案。下面是代码:

<?php
$input = "<p>text</p>";
$tem = $input;
$tem = htmlspecialchars($input);
$tem = preg_replace('/&lt;p&gt;(.+?)&lt;\/p&gt;/','<p>$1</p>',$tem);
echo $tem;
?>

您不需要捕获p标签之间的内容,只需替换p标签:

$html = preg_replace('~&lt;(/?p)&gt;~', '<$1>', $html);
$html=preg_replace(“~(/?p)~”,“$html);
但是,您也不需要正则表达式:

$trans = array('&lt;p&gt;' => '<p>', '&lt;/p&gt;' => '</p>');
$html = strtr($html, $trans);
$trans=array('p'=>'','/p'=>'

'); $html=strtr($html,$trans);
您遇到的问题中至少有一部分可能是由于您在HTML实体中使用分号时显得太过随意。它们总是以符号和开头,以分号结尾。所以它是
,而不是
>
,正如你在文章中所说的那样

也就是说,为什么不使用,这不需要滥用正则表达式

$string = 'shoop &lt;p&gt;da&lt;/p&gt; woop';
echo html_entity_decode($string);
// output: shoop <p>da</p> woop
$string='shoop-pda/p-woop';
回显html_实体_解码($string);
//输出:shoopda

woop
”1美元,特姆)--此处缺少一个引号。您确定这不是问题所在吗?您的变量是否包含
是否使用了除/以外的字符来分隔模式,这样您就不必担心转义模式中的所有字符(
'#p>…
)。此外,字符类运算符[和]对序列/组不起作用,只对单个字符起作用。)@Phil Perry如果某个字符不是字符序列,我该如何比较,因为[]似乎只对单个字符进行比较?如果您希望用相应的替换序列替换多个序列中的一个,您可以使用目标模式数组和替换字符串数组,而不是一个可怕的正则表达式。由于[]只匹配单个字符,如果要匹配字符串,我应该使用什么?