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