无法理解如何使用php中的preg_replace()匹配除给定序列之外的所有字符
所以我要做的是匹配一个正则表达式,它有一个开头无法理解如何使用php中的preg_replace()匹配除给定序列之外的所有字符,php,regex,Php,Regex,所以我要做的是匹配一个正则表达式,它有一个开头p标记和结束符</;ptag。这是我写的代码: <?php $input = "<p>just some text</p> more text!"; $input = preg_replace('/<p>[^(<\/p>)]+?<\/;p>/','<p>$1</p>',$tem); echo
p代码>标记和结束符</;p
tag。这是我写的代码:
<?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>)]
没有正确地分组所有字符。我认为它会检查是否有任何字符不存在,也不会检查整个字符组是否不存在。请帮我一个忙。[]在正则表达式中是一个字符组,不能用这种方式匹配字符串,只能匹配字符或unicode码点
如果已转义HTML实体,则可以使用将它们转换回字符
获得有效的HTML后,可以使用DOM对其进行解析、遍历和操作。
我想我找到了答案。下面是代码:
<?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);
$html=preg_replace(“~(/?p)~”,“$html);
但是,您也不需要正则表达式:
$trans = array('<p>' => '<p>', '</p>' => '</p>');
$html = strtr($html, $trans);
$trans=array('p'=>'','/p'=>'');
$html=strtr($html,$trans);
您遇到的问题中至少有一部分可能是由于您在HTML实体中使用分号时显得太过随意。它们总是以符号和开头,以分号结尾。所以它是
,而不是>
,正如你在文章中所说的那样
也就是说,为什么不使用,这不需要滥用正则表达式
$string = 'shoop <p>da</p> woop';
echo html_entity_decode($string);
// output: shoop <p>da</p> woop
$string='shoop-pda/p-woop';
回显html_实体_解码($string);
//输出:shoopdawoop
”1美元,特姆)代码>--此处缺少一个引号。您确定这不是问题所在吗?您的变量是否包含
或是否使用了除/以外的字符来分隔模式,这样您就不必担心转义模式中的所有字符('#p>…
)。此外,字符类运算符[和]对序列/组不起作用,只对单个字符起作用。)@Phil Perry如果某个字符不是字符序列,我该如何比较,因为[]似乎只对单个字符进行比较?如果您希望用相应的替换序列替换多个序列中的一个,您可以使用目标模式数组和替换字符串数组,而不是一个可怕的正则表达式。由于[]只匹配单个字符,如果要匹配字符串,我应该使用什么?