正则表达式来替换与相应的(Regular expression to replace an

2019-07-18 15:07发布

我在寻找一个PHP的preg_replace()解决方案,可以链接到的图像,并与相应的图片代码替换它们。

找:

<a href="http://www.domain.tld/any/valid/path/to/imagefile.ext">This will be ignored.</a>

用。。。来代替:

<img src="http://www.domain.tld/any/valid/path/to/imagefile.ext" alt="imagefile" />

其中协议必须是http://,所述.EXT必须是有效的图像格式(.JPG,.JPEG,.GIF .PNG,.TIF),和基本文件名变为ALT =“”值。

我知道的preg_replace()是这个职位的合适的功能,但我用正则表达式吸,所以任何帮助是极大的赞赏! 谢谢!

Answer 1:

恭喜你,你是百万分之一的客户问堆栈溢出如何用正则表达式解析HTML!

[X] [HT] ML不是正则语言,并且不能可靠地与正则表达式进行解析。 使用HTML解析器。 PHP本身给你DOM文档 ,或者你可能更喜欢simplehtmldom 。

顺便说一句,你不能说一个文件是什么类型通过观察它的URL。 没有理由为JPEG必须有“.JPEG”作为扩展 - 事实上,不能保证与“.JPEG”扩展名的文件实际上是JPEG。 是一定的唯一方法是,以获取资源(例如,使用HEAD请求),并期待在Content-Type头。



Answer 2:

啊,我每天DOM的做法。 您应该使用DOM来解析HTML和正则表达式解析字符串,例如HTML属性。

注:我有,本可以通过一些向导在改善一些基本的正则表达式:)

注2:虽然它可能是额外的开销,你可以使用像卷曲彻底检查href是通过发送HEAD请求并查看内容类型的实际图像,但是这将在80-90%的病例工作。

<?php

$content = '

<a href="http://www.domain.tld/any/valid/path/to/imagefile.ext">This will be ignored.</a>
<br>

<a href="http://col.stb.s-msn.com/i/43/A4711309495C88F8CD154C99FCE.jpg">this will not be ignored</a>

<br>

<a href="http://col.stb.s-msn.com/i/A0/8E9A454F701E4F5F89E58E14B532C.jpg">bah</a>
';

$dom = new DOMDocument();
$dom->loadHTML($content);

$anchors = $dom->getElementsByTagName('a');

$i = $anchors->length-1;

$protocol = '/^http:\/\//';
$ext = '/([\w+]+)\.(?:gif|jpg|jpeg|png)$/';

if ( count($anchors->length) > 0 ) {
    while( $i > -1 ) {
    $anchor = $anchors->item($i);
    if ( $anchor->hasAttribute('href') ) {
        $link = $anchor->getAttribute('href');

        if ( 
        preg_match ( $protocol , $link ) &&
        preg_match ( $ext, $link )
        ) {
        //echo 'replacing this one.';
        $image = $dom->createElement('img');

        if ( preg_match( $ext, $link, $matches ) ) {
            if ( count($matches) ) {
            $altName = $matches[1];
            $image->setAttribute('alt', $altName);
            }
            $image->setAttribute('src', $link);
            $anchor->parentNode->replaceChild( $image, $anchor );
        }
        }

    }
    $i--;
    }
}

echo $dom->saveHTML();


Answer 3:

我会建议使用这种更灵活的非greddy正则表达式:

<a[^>]+?href=\"(http:\/\/[^\"]+?\/([^\"]*?)\.(jpg|jpeg|png|gif))[^>]*?>[^<]*?<\/a>

而更复杂的正则表达式(包括PHP测试代码),希望能够取悦浓汤:)

<?php
$test_data = <<<END
<a blabla="asldlsaj" alksjada="aslkdj" href="http://www.domain.tld/any/valid/path/to/imagefile.jpg" lkjasd=""asdlaskjd>This will be ignored.</a>
Lorem ipsum..
<a    blabla=asldlsaj alksjada="aslkdj" href="http://www.domain.tld/any/valid/path/to/imagefile.jpg" lkjasd=""asdlaskjd>This will be ignored.</a>
<a lkjafs='asdsa> ' blabla="asldlksjada=>"aslkdj" href="http://www.domain.tld/any/valid/path/to/imagefile.jpg" lkjasd=""asdlaskjd>This will be ignored.</a>
<a    blabla="ajada="aslk href="http://www.domain.tld/any/valid/path>/to/imagefile.jpg" lkjasd>asdlaskjd>This will be ignored.</a>
<a    blabla="asldlsaj>" aslkdj href="http://www.domain.tld/any/valid/path/ to/imagefile.jpg" lkjasd=""asdlaskjd>This will be ignored.</a>
Something:
<a    blabla='asldls<ajslkdj' href="http://www.domain.tld/any/valid'/path/to/imagefile.jpg" lkjasd=""asdlaskjd>This will be ignored.</a>
<a    blabla=  asldlsadj href="http://www.domain.tld/any/valid/path/to/imagefile.jpg" lkjasd>This will be ignored.</a>
<a blabla="asldlsaj" alksjslkdj" href='http://www.domain.tld/any/valid/path/to/imagefile.jpg' lkjasdskjd>This will be ignored.</a>
Something else...
<a    blabla="asldlsaj" alksjslkdj" href='http://www.domain.tld/any/valid/path/to/imagefile.jpg' lkjasdskjd>This will be ignored.</a>
<a    blabla="asldlsaj" alksjada="aslkdj" href=http://www.domain.tld/any/valid/path/to/imagefile.jpg lkjdlaskjdll> be ignored.</a>
END;
$regex = "/<a\s(\s*\w+(\s*=\s*(\".*?\"|'.*?'|[^'\">\s]+))?)+?\s+href\s*=\s*(\"(http:\/\/[^\"]+\/(.*?)\.(jpg|jpeg|png|gif))\"|'(http:\/\/[^']+\/(.*?)\.(jpg|jpeg|png|gif))'|(http:\/\/[^'\">\s]+\/([^'\">\s]+)\.(jpg|jpeg|png|gif)))\s(\s*\w+(\s*=\s*(\".*?\"|'.*?'|[^'\">\s]+))?)+>[^<]*?<\/a>/i";
$replaced = preg_replace($regex, '<img src="$5$8$11" alt="$6$9$12" />', $test_data);

echo '<pre>'.htmlentities($replaced);
?>


文章来源: Regular expression to replace an with respective