3

次のような古いシステムを使用するいくつかのページにリンクがあります。

<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 t0 を使用して、必要なものの一部を変更できますが、代わりにクエリ内のアンダースコアを + に置き換える必要もあります。私の現在のコードは次のとおりです。

//$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_replace を実行したいので、preg_replace_callback を使用してみましたが、うまくいきませんでした。私は何をすべきか?

4

4 に答える 4

3

2番目のパラメーターとして有効なコールバック[docs]を渡す必要があります:関数名、無名関数など。

次に例を示します。

function my_replace_callback($match) {
    $q = str_replace('_', '+', $match[2]);
    return $match[1] . '="http://www.site.com/newapp/?q=' . $q;
}
$content = preg_replace_callback('#(href)="http://www.site.com/app/?query=([^:"]*)(?:")#', 'my_replace_callback', $content);

またはPHP5.3の場合:

$content = preg_replace_callback('#(href)="http://www.site.com/app/?query=([^:"]*)(?:")#', function($match) {
    $q = str_replace('_', '+', $match[2]);
    return $match[1] . '="http://www.site.com/newapp/?q=' . $q;
}, $content);

正規表現の代わりにHTMLパーサーを試してみることもできます。PHPでHTML/XMLをどのように解析および処理しますか?

于 2011-09-01T10:25:04.873 に答える
3

ドキュメントをdomで解析し、すべての「a」タグを検索してから置き換えるのが良い方法です。正規表現が常に 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_replace で行ったことに注意してください。ただし、これはstr_ireplaceまたは str_replaceで行うことができます

$newHref = str_ireplace("/app/?query=", "/newapp/?q=", $href);
于 2011-09-01T10:41:57.110 に答える
0

preg_replace配列をパターンおよび置換としてに渡します。

preg_replace(array('|/app/|', '_'), array('/newappp/', '+'), $content);
于 2011-09-01T10:52:34.213 に答える
0

または、単純に preg_match() を使用して、一致した文字列を収集することもできます。次に、一致するものの 1 つに str_replace() を適用し、「+」を「_」に置き換えます。

$content = preg_match('#href="\/[^\/]\/\?query=([^:"]+)#', $matches)
$matches[2] = 'newapp';
$matches[4] = str_replace('_', '+', $matches[4]);
$result = implode('', $matches)
于 2011-09-01T10:33:55.177 に答える