2017-07-21 15 views
0

私は、この文字列から2番目のURLを抽出する必要があります。テキストが繰り返され、新しい行が含まれている場合、テキスト間の部分文字列を取得する方法は?

$string = '<td class="table_td"> submitted by <a href="https://www.example.com/account/user" target="_blank" rel="nofollow"> account </a> <br> 
<a href="https://www.URL-I-NEED.com/BKHHZu_A4lu" target="_blank" rel="nofollow">[site]</a> <a href="https://www.example.com/settings/user/" target="_blank" rel="nofollow">[settings]</a></td>'; 

私はthis solutionを試みたが、これらの設定を試してみました:

$startTag = ' <a href="'; 
$endTag = '" target'; 

しかし、それはそれらのため、最初のURLとない私は必要なものを返さタグは、必要な部分文字列の前にも表示されます。

改行の前に<br>を追加して、$startTagにしようとしましたが、文字列を返しませんでした。

基本的には$startTag{newline} <a href="である必要がありますが、その改行の挿入方法を理解できません。

これは間違っていると思いますが、単純にその文字列からすべてのURLを抽出して単純に2番目のURLを選択するだけで簡単に行うことができます。

どちらの方法でも、上記の文字列の2番目のURLはどのように抽出できますか?

+2

は、HTMLの解析のための正規表現を避けてください。 'DOM'パーサを使います。 – anubhava

+0

正規表現の改行文字は '\ n'です。 – RToyo

+0

@anubhavaこれには理由がありますか?私はそれについて読むのが大好きです:) – GrumpyCrouton

答えて

2

あなたは、このコードとしてDOM parserを使用することができます。

$string = '<td class="table_td"> submitted by 
<a href="https://www.example.com/account/user" target="_blank" rel="nofollow"> account </a> <br> 
<a href="https://www.URL-I-NEED.com/BKHHZu_A4lu" target="_blank" rel="nofollow">[site]</a> 
<a href="https://www.example.com/settings/user/" target="_blank" rel="nofollow">[settings]</a> 
</td>'; 

$doc = new DOMDocument(); 
libxml_use_internal_errors(true); 
$doc->loadHTML($string); // loads your html 
$xpath = new DOMXPath($doc); 

// query all <a...> elements 
$nodelist = $xpath->query("//a"); 

// get 2nd element from the list 
$node = $nodelist->item(1); 

// extract href attribute 
$link = $node->getAttribute('href'); 

echo $link . "\n"; 
//=> https://www.URL-I-NEED.com/BKHHZu_A4lu 

Code Demo

+1

また、 'DOMXPath :: '$ link = $ xpath-> evaluate(" string(// td/a [2]/@ href) ");' –

関連する問題