PHP str_replace()和preg_replace()不适用于HTML
当我尝试在函数中执行PHP str_replace()和preg_replace()不适用于HTML,php,regex,preg-replace,Php,Regex,Preg Replace,当我尝试在函数中执行str_replace()或preg_replace()时,内容不会改变 变量中的内容$sadrzaj: $sadrzaj = '<p>asdasdasds</p><p><a href="http://www.example.com/wp-content/uploads/2018/11/image.jpg" itemprop="url" title="some title"><img alt="some alt title
str_replace()
或preg_replace()
时,内容不会改变
变量中的内容$sadrzaj
:
$sadrzaj = '<p>asdasdasds</p><p><a href="http://www.example.com/wp-content/uploads/2018/11/image.jpg" itemprop="url" title="some title"><img alt="some alt title" class="alignnone size-full wp-image-243618" src="http://www.example.com/wp-content/uploads/2018/11/image.jpg" width="940" height="529"></a></p>asdasdasd<p>asdasd</p><h3>asdada</h3><p><a href="http://www.example.com/wp-content/uploads/2018/11/image_02.jpg" itemprop="url" title="some title 02"><img alt="some alt title 02" class="alignnone size-full wp-image-243653" src="http://www.example.com/wp-content/uploads/2018/11/image_02.jpg" width="940" height="529"></a></p><h3>asdasd</h3>';
调用函数to_je_to($sadrzaj)代码>-没有任何变化
如果类中有“大小已满”
,请查找此图像并将其标记替换为
即使是str_replace()
或preg_replace()
也不起作用
我做错了什么
谢谢您的功能有一些问题(在preg\u match\u all
和preg\u replace
中)。此外,在匹配
标记上的类方面,您需要更加复杂。总的来说,您最好像另一个答案所建议的那样使用内置的DOMDocument类。如果您想继续使用regex,这个函数应该可以解决您遇到的问题
function to_je_to($content){
preg_match_all('/<img[^>]+>/', $content, $images);
if(!is_null($images)){
foreach($images[0] as $index => $value){
if(preg_match('/class="[^"]*(?<=["\s])size-full[\s"]/', $value)){
$new_img = str_replace('<img', '<img data-example', $value);
$content = preg_replace('/' . preg_quote($value, '/') . '/', $new_img, $content);
}
}
}
return $content; // return no difference
}
echo to_je_to($sadrzaj);
function to_je_to($content){
preg_match_all('/]+>/',$content,$images);
如果(!为null($images)){
foreach($images[0]作为$index=>$value){
如果(preg_match)('/class=“[^”]*(?您所做的错误是使用正则表达式解析HTML。您应该使用适当的DOM解析器,然后可以使用XPath查询来隔离所需的元素
<?php
$sadrzaj = '<p>asdasdasds</p><p><a href="http://www.example.com/wp-content/uploads/2018/11/image.jpg" itemprop="url" title="some title"><img alt="some alt title" class="alignnone size-full wp-image-243618" src="http://www.example.com/wp-content/uploads/2018/11/image.jpg" width="940" height="529"></a></p>asdasdasd<p>asdasd</p><h3>asdada</h3><p><a href="http://www.example.com/wp-content/uploads/2018/11/image_02.jpg" itemprop="url" title="some title 02"><img alt="some alt title 02" class="alignnone size-full wp-image-243653" src="http://www.example.com/wp-content/uploads/2018/11/image_02.jpg" width="940" height="529"></a></p><h3>asdasd</h3>';
function to_je_to($content) {
$dom = new DomDocument;
$dom->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xp = new DomXpath($dom);
$nodes = $xp->query("//img[contains(concat(' ', normalize-space(@class), ' '), ' size-full ')]");
foreach ($nodes as $img) {
$img->setAttribute("data-example", "");
}
return $dom->saveHTML();
}
echo to_je_to($sadrzaj);
您的img
标记不是以/>
结尾,而是仅以
结尾,因此您的正则表达式不会捕获它们。^^^^^^这就是为什么我们不使用正则表达式解析HTML…@miken32是的。DOM解析器似乎更合适。感谢您对我的缺点进行了前馈。我会记住进一步编程。太棒了。我非常感谢您在解决问题方面的帮助和您的时间。请记住,此函数有错误,我看到了double@KikiFIstrekNovi请查看我编辑的答案。我已经解决了miken32提出的所有有效问题。@KikiFIstrekNovi这是一个比我更好的答案。您应该接受它。
<?php
$sadrzaj = '<p>asdasdasds</p><p><a href="http://www.example.com/wp-content/uploads/2018/11/image.jpg" itemprop="url" title="some title"><img alt="some alt title" class="alignnone size-full wp-image-243618" src="http://www.example.com/wp-content/uploads/2018/11/image.jpg" width="940" height="529"></a></p>asdasdasd<p>asdasd</p><h3>asdada</h3><p><a href="http://www.example.com/wp-content/uploads/2018/11/image_02.jpg" itemprop="url" title="some title 02"><img alt="some alt title 02" class="alignnone size-full wp-image-243653" src="http://www.example.com/wp-content/uploads/2018/11/image_02.jpg" width="940" height="529"></a></p><h3>asdasd</h3>';
function to_je_to($content) {
$dom = new DomDocument;
$dom->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xp = new DomXpath($dom);
$nodes = $xp->query("//img[contains(concat(' ', normalize-space(@class), ' '), ' size-full ')]");
foreach ($nodes as $img) {
$img->setAttribute("data-example", "");
}
return $dom->saveHTML();
}
echo to_je_to($sadrzaj);