繁体   English   中英

无法理解如何将除给定序列以外的所有字符与php中的preg_replace()进行匹配

[英]unable to understand how to match all characters except a given sequence with preg_replace() in php

所以我想做的是匹配一个具有<p>;开头的正则表达式<p>; 标签和结束&lt/;p> 标签。这是我写的代码:

<?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;
?>

因此,代码似乎不更换&lt;p&gt<p>或更换&lt;/p&gt</p> .I认为这个问题是在我检查所有字符期望部分'&lt;/p&gt 我认为代码[^(&lt;\\/p&gt)]不能正确分组所有字符。 我认为它会检查是否不存在任何字符,也不检查是否不存在整个字符组。 请帮我在这里。

RegEx中的[]是字符组,您不能以这种方式匹配字符串,只能匹配字符或Unicode代码点。

如果转义了HTML实体,则可以使用htmlspecialchars_decode()将它们转换回字符。

拥有有效的HTML之后,可以使用DOM进行解析,遍历和操作。 您如何在PHP中解析和处理HTML / XML?

我想我明白了。这是代码:

<?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);

但是,您也不需要正则表达式:

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

您遇到的麻烦至少部分原因可能是由于您似乎对HTML实体中的分号玩得太快而又松懈。 它们总是以“&”号开头,以分号结尾 所以是&gt; ,而不是&gt因为您的帖子分散了。

也就是说,为什么不使用不需要滥用正则表达式的html_entity_decode()呢?

$string = 'shoop &lt;p&gt;da&lt;/p&gt; woop';
echo html_entity_decode($string);
// output: shoop <p>da</p> woop

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM