PRIG_REPLACE还是PREG_REPLACE_CALLBACK? [英] Preg_replace or preg_replace_callback?

查看:25
本文介绍了PRIG_REPLACE还是PREG_REPLACE_CALLBACK?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一些使用旧系统的页面上有链接,例如:

<a href='/app/?query=stuff_is_here'>This is a link</a>

它们需要转换到新系统,如下所示:

<a href='/newapp/?q=stuff+is+here'>This is a link</a>

我可以使用PREG_REPLACE更改一些需要的内容,但我还需要将查询中的下划线替换为+。我当前的代码是:

//$content is the page html
$content = preg_replace('#(href)="http://www.site.com/app/?query=([^:"]*)(?:")#','$1="http://www.site.com/newapp/?q=$2"',$content);

我想做的是对$2变量运行str_place,所以我尝试使用preg_place_callback,但始终无法使其正常工作。我该怎么办?

推荐答案

使用dom解析文档,搜索所有"a"标记,然后替换可能是一种很好的方法。已经有人评论发布您this link,向您展示正则表达式并不总是处理html的最佳方式。

此代码应始终正常工作:

<?php
$dom = new DOMDocument;
//html string contains your html
$dom->loadHTML($html);
?><ul><?
foreach( $dom->getElementsByTagName('a') as $node ) {
    //look for href attribute
    if( $node->hasAttribute( 'href' ) ) {
        $href = $node->getAttribute( 'href' );
        // change hrefs value
         $node->setAttribute( "href", preg_replace( "//app/?query=(.*)/", "/newapp/?q=1", $href ) );
    }
}
//save new html
$newHTML = $dom->saveHTML(); 
?>

请注意,我使用preg_place执行了此操作,但也可以使用str_ireplace或str_place

完成此操作
$newHref = str_ireplace("/app/?query=", "/newapp/?q=", $href);

这篇关于PRIG_REPLACE还是PREG_REPLACE_CALLBACK?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆