Php 从段落中提取并替换所有图像
我有以下html内容:Php 从段落中提取并替换所有图像,php,regex,html-parsing,Php,Regex,Html Parsing,我有以下html内容: <p><img src="##" /> </p> <p> <img src="##" /> </p> <p> </p> <p class="ss"><a href="ss"> <img src="####" /> </a></p> 我想提取所有段落及其所有图像,并重新格式化html,以便我可
<p><img src="##" />
</p>
<p>
<img src="##" />
</p>
<p>
</p>
<p class="ss"><a href="ss">
<img src="####" />
</a></p>
我想提取所有段落及其所有图像,并重新格式化html,以便我可以先获得图像,然后是以下段落这是一个示例:
<img src="##" /><p>
</p>
<img src="##" />
<p>
</p>
<p>
</p>
<img src="####" />
<p class="ss"><a href="ss">
</a></p>
我尝试了一些东西,但不起作用:
$result = preg_replace('/(<p\b[^><]*)>(.+?)(<img([^>]*)\/>)(.+?)(<\/p>)/is', '$2 $4', $text);
$result=preg\u replace('/(.+?)(]*)\/>)(.+?)()/is'、'$2$4'、$text);
这是非常粗糙的,可能比您希望的匹配更多,但在非常简单的场景中,这可能会起作用:
$result = preg_replace('/(<p[^>]*>)(.*?)(<img[^>]*>)/is', '$3$1$2', $text);
$result=preg_replace('/(]*>)(.*?(]*>)/is'、'$3$1$2'、$text);
这可能更好:
$result = preg_replace('/(<p[^>]*>)([^<]*)(<img[^>]*>)/is', '$3$1$2', $text);
$result=preg_replace('/(]*>)([^)/is'、'$3$1$2'、$text);
对于我来说,它会查找包含任何内容和图像的每个段落,因此我可以匹配所有图像及其包含的段落
$pattern = '/(<p\b[^><]*>)(((?!<\/p>).?)*)(<img.*?\/\>)(((?!<\/p>).?)*)(<\/p>)/s';
$pattern='/()((?!).?)*()(((?!).?)*)()/s';
使用html解析器很难做到这一点,更不用说使用正则表达式了。这就是我想要的,只有正则表达式。为什么坚持使用正则表达式?这会容易得多。这似乎是我设计它的方式。它不是要在嵌套时提取img标记。它可以,但也会错误地提取一些不应该提取的图像。我的假设是错误的根据OP的例子,img标签会紧跟在p标签打开之后,我只会拉它们。在你的例子中,你从锚标签中拉了一个img标签,这会使锚毫无用处,img不可点击。在这种情况下,你可能想同时从p标签中拉锚标签和img标签,但那不是这不是他所要求的——当出现未定义的情况时,最好是安全,而不是破坏源代码。这很好。能解释一下它的作用吗?