2016-10-30 4 views
1

私は連想配列$dicを持っていますが、$dicの対応する文字列にHTML文字列のhrefリンクを置きたいと思います。ここでpreg_replace置換参照を配列キーとしてアクセス

は私のコードです:

$string = preg_replace("/<a href=\"(.*?)\">(.*?)<\/a>/s", "$2->{$dic["$1"]}", $string); 

意図したように上記の正規表現は動作しません。しかし、この形式では動作します:

$string = preg_replace("/<a href=\"(.*?)\">(.*?)<\/a>/s", "$2->$1", $string); 

は私がLinkText->LinkFromDicとして<a>タグを保存したいです。

答えて

2

ためcomplex expression{$dic["$1"]}"$1"が、文字列リテラル"$1"と解釈される:複合式はpreg_replace置換 参照が適用され処理される

  • $1は、PHPで無効variable nameです:

    有効な変数名は、文字、数字、またはアンダースコアの任意の数字が続く文字またはアンダースコアで始まります。

    string(10) "Dollar One" 
    

    古いPHPのバージョンは、のように置換文字列を評価することができe正規表現修飾子を、サポート

    $dic = ['$1' => 'Dollar One']; 
    var_dump("{$dic["$1"]}"); 
    

    出力:

それを確認することは容易ですPHPコード。しかし、PHP 5.5.0では廃止され、PHP 7.0.0では削除されました。

しかし、php_replace_callback機能は、問題を解決するのに十分な柔軟性がある:

$dic = ['/page/a' => 'Page A']; 

$string = <<<'EOHTML' 
<a href="/page/a">Link</a> 
EOHTML; 

$string = preg_replace_callback('/<a href\="(.*?)">(.*?)<\/a>/s', 
    function ($matches) use ($dic) { 
    $v = isset($dic[$matches[1]]) ? $dic[$matches[1]] : $matches[1]; 
    return count($matches == 3) ? "{$matches[2]}->$v" : $matches[0]; 
}, $string); 

var_dump($string); 

出力お返事のための

string(12) "Link->Page A" 
+0

おかげで、どのように$ DIC変数から値を取得します。出力は "Link-> Page A" –

関連する問題