2017-08-11 49 views
-2

比方說,我有一個字符串$海峽這樣的:預謀正則表達式中的字符串匹配測試的各個環節

aaa 
<a href="link.php?x=banana">text 1</a> 
bbb 
<a href="different_url.php">text 2</a> 
ccc 
<a href="link.php?x=orange">text 3</a> 
ddd 

我想要讓這個有link.php在所有這些環節將有x值預先考慮到他們,所以例如:

aaa 
banana <a href="link.php?x=banana">text 1</a> 
bbb 
<a href="different_url.php">text 2</a> 
ccc 
orange <a href="link.php?x=orange">text 3</a> 
ddd 

我試圖做到這一點使用的preg_replace,但我似乎並沒有能夠正確地建立我的正則表達式了:

$str = preg_replace('/<a (.*?)link.php(.*?)<\/a>/', '$2 <a $1link.php$2<\/a>', $str); 

當然這不起作用。由於我希望它包含整個原始字符串以及一個子集,因此我對於如何構建它有點遺憾。

要做到這一點,最簡單的方法是什麼?爲了將來的參考,甚至稱這種操作是什麼?

+0

顯示您的嘗試。 – axiac

回答

0

這是一種使用DOMDocument的方法。使用方法DOMNode::insertBefore可以輕鬆地在節點之前插入一些東西。

$html = <<<'EOD' 
aaa 
<a href="link.php?x=banana">text 1</a> 
bbb 
<a href="different_url.php">text 2</a> 
ccc 
<a href="link.php?x=orange">text 3</a> 
ddd 
EOD; 

$dom = new DOMDocument; 
$dom->loadHTML('<div id="root">' . $html . '</div>'); 
$nodeList = $dom->getElementsByTagName('a'); 

foreach($nodeList as $link) { 
    $query = parse_url($link->getAttribute('href'), PHP_URL_QUERY); 
    if (!$query) continue; 
    parse_str($query, $arr); 
    if (isset($arr['x'])) 
     $link->parentNode->insertBefore($dom->createTextNode($arr['x'] . ' '), $link); 
} 

$result = ''; 

foreach($dom->getElementById('root')->childNodes as $childNode) { 
    $result .= $dom->saveHTML($childNode); 
} 

echo $result; 

demo

DOMDocument需要一個根元素,以便能夠建立DOM樹。由於您處理的是html文檔的一部分,而不是整個html文檔,因此您需要添加一個虛擬根元素<div id="root">...</div>,並在最後提取此根元素的所有子元素。

+0

我在最後一個foreach getElementById('root') - > childNodes,但我看到其他循環工作。感謝您的建議! –