2016-11-04 2 views
0

この質問には、WordPressの背景がたくさんありますが、ここで問題となっているPHP知識の欠如が欲しいと思っています。PHPの正規表現を使用して複数のhref値を置き換える

<a>のようなタグを検索する正規表現があります。<a href="http://website.co.uk/post/post-title">Find Out More</a>は、ユーザーが入力したコンテンツから生成されます。このコンテンツが見つかると、foreachループが一致するテキストを実行し、WordPress関数$postId = url_to_postid($url);を使用してURLをPostIDに変換します。

これは出力の例です。<a href="#171">Find Out More</a>です。

これは、一致する各テキストに1つのリンクがある限り、正常に動作します。しかし、2つ以上のリンクがある場合、すべてのリンクが同じhrefに間違っているように設定されます。

これは私のループがどのように動いているかと関係があります。私が使用しているコードは以下の通りです:

<?php 
$string = get_field('sample_text_box'); 
$pattern = "/(?<=href=(\"|'))[^\"']+(?=(\"|'))/"; 
preg_match_all($pattern, $string, $matches); 
$urls = $matches[0]; 

foreach($urls as $key => $url) { 
$postId[$key] = url_to_postid($url); 
} 

$newstring = preg_replace($pattern , $postId[$key] , $string); 
echo $newstring; 
?> 

ラインget_field('sample_text_box');は「が指定したフィールドの値を返します」高度なカスタムフィールド機能です。役立つ場合は、こちらをご覧ください:https://www.advancedcustomfields.com/resources/get_field/

ありがとう!

+0

あなたは、このコードブロックの末尾に複数の '$ newstring'を期待している:

しかし、問題は簡単にpreg_replace_callback機能で解決されますか? – WillardSolutions

+1

**正規の質問なしでHTMLの正規表現質問をすることはできません(http://stackoverflow.com/a/1732454/2191572) – MonkeyZeus

+0

@EatPeanutButter基本的には、それぞれのhref '値が追加されました。すべての' href'が更新された後、複数の '$ newstring'を1つのテキストブロックにまとめてまとめることで達成できるかどうかはわかりません。 – kieranstartup

答えて

1

コードに問題があります。実際には$postId[$key]という単一の値でパターンを置き換えています。$keyforeachで最後に割り当てられた値です。

preg_replaceは、パターンと置換の両方が文字列でも配列でも同じ種類であると予想しているため、$postIdを渡すこともできません。

$pattern = '/(?<=href\="|\')([^"\']+)(?="|\')/m'; 

$new_string = preg_replace_callback($pattern, function ($matches) { 
    return isset($matches[1]) ? url_to_postid($matches[1]) : $matches[0]; 
}, $string); 
+0

このルーランに感謝します!私はそれを貼り付けてみましたが、私はそれを実行するときにテキストが返されていません。私は '$ pattern = .....'を自分のもので置き換えると仮定します。しかし、どこに '$ new_string ... 'を置くのですか?ありがとう! – kieranstartup

+1

@kieranstartup [this](https://eval.in/672008)fiddle –

+0

パーフェクト、すぐに動作します。そのリンクを提供してくれてありがとう!とても有難い! – kieranstartup

関連する問題