2017-11-10 1 views
1

preg_match(または他の方法)を使用して、以下のようなリストからIDを取得することはできますか?PHP:名前によるhref検索のIDの抽出

例: 検索:datadata エコー(そのID):num0035586039

<a href="page1.html#num0035583725">name1</a> 
<a href="page30.html#num0035584494">othername</a> 
<a href="page55.html#num0035584859">word</a> 
<a href="page132.html#num0035585496">wordname</a> 
<a href="page133.html#num0035586039">datadata</a> 
<a href="page203.html#num0035586647">fsdfasfas</a> 

ありがとう!

答えて

0
<?php 
$dataArray=array('<a href="page1.html#num0035583725">name1</a>','<a href="page30.html#num0035584494">othername</a>'); 

$data=''; 
foreach($dataArray as $row){ 
    if (strpos($row, 'othername') !== false) { 
     $whatIWant = substr($row, strpos($row, "#") + 1); 
     $newData=substr($whatIWant, 0, strpos($whatIWant, '"')); 
     echo $newData; 
    } 
} 

あなたの出力はあなたが探しているIDです。

編集:配列内に2つのリンクを設定して、自分のコードが目的の値(name1)に一致するように配列全体を探しています。それが見つかると、それはチルミングに移ります。出力はもちろんidです。あなたの検索基準に一致する2つ以上のHREFがある場合、それらのIDを印刷します(したがって、1に限定されません)。

編集:あなたがあなたの検索シンプル行くにマッチした全体のリンクを取得するには、次のように

<?php 
$url = 'http://username:[email protected]:9090/path?arg=value#anchor'; 

function unparse_url($parsed_url) { 
    $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : ''; 
    return "$fragment"; 
} 
?> 

linkに説明

if (strpos($row, 'othername') !== false) { 
     echo htmlspecialchars($row); 
//the rest of the code 
+0

感謝。 しかし、name1の行だけを取得するにはどうすればよいですか? –

+0

私の答えがあなたの質問に合っていればそれを受け入れてください。 – pr1nc3

+0

申し訳ありません。私は文章を終える前に誤って入力した。 –

0

を返し、 (非常に)汚い答え:

$data = '<a href="page1.html#num0035583725">name1</a> 
<a href="page30.html#num0035584494">othername</a> 
<a href="page55.html#num0035584859">word</a> 
<a href="page132.html#num0035585496">wordname</a> 
<a href="page133.html#num0035586039">datadata</a> 
<a href="page203.html#num0035586647">fsdfasfas</a>'; 

preg_match_all("/#num(\d+)\">([^<]*)</", $data, $matches); 
$search = array_combine($matches[1], $matches[2]); 
print_r($search); 

での結果:

Array 
(
    [0035583725] => name1 
    [0035584494] => othername 
    [0035584859] => word 
    [0035585496] => wordname 
    [0035586039] => datadata 
    [0035586647] => fsdfasfas 
) 

#numの出現のための正規表現をスキャンし、その後"><の間のすべてを取ります。

私はすでに汚れていると言いましたか?正規表現はXMLを解析するための厄介な方法です。いくつかのパーサーを使いましょう。

+0

@Matthijs助けてくれてありがとう。私もあなたが示したものを試してみます。それでは、あまり聞いていないのであれば、パーサをどうやって使うのですか? –

0

私は正規表現を使用しません。 HTMLパーサーを使用して正確なHREFを取得し、URLパーサーを使用してフラグメントを取得することができます。

$string = '<a href="page1.html#num0035583725">name1</a> 
<a href="page30.html#num0035584494">othername</a> 
<a href="page55.html#num0035584859">word</a> 
<a href="page132.html#num0035585496">wordname</a> 
<a href="page133.html#num0035586039">datadata</a> 
<a href="page203.html#num0035586647">fsdfasfas</a>'; 
$doc = new DOMDocument('1.0', 'utf-8'); 
libxml_use_internal_errors(true); 
$doc->LoadHTML($string, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
$links = $doc->getElementsByTagName('a'); 
foreach($links as $link){ 
    if(strpos($link->nodeValue, 'name1') !== FALSE) { 
     $href = $link->getAttribute('href'); 
     $url_bits = parse_url($href); 
     echo $url_bits['fragment']; 
    } 
} 

デモ:何らかの理由でURLパーサが動作していない場合https://3v4l.org/DNdE5

はあなたがここに$hrefに、正規表現を使用して爆発、またはpreg_splitことができます。正規表現のアプローチは次のようになります。

$string = '<a href="page1.html#num0035583725">name1</a> 
<a href="page30.html#num0035584494">othername</a> 
<a href="page55.html#num0035584859">word</a> 
<a href="page132.html#num0035585496">wordname</a> 
<a href="page133.html#num0035586039">datadata</a> 
<a href="page203.html#num0035586647">fsdfasfas</a>'; 
$doc = new DOMDocument('1.0', 'utf-8'); 
libxml_use_internal_errors(true); 
$doc->LoadHTML($string, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
$links = $doc->getElementsByTagName('a'); 
foreach($links as $link){ 
    if(strpos($link->nodeValue, 'name1') !== FALSE) { 
     $href = $link->getAttribute('href'); 
     preg_match('/#\K.+/', $href, $fragment); 
     echo $fragment[0]; 
    } 
} 

デモ:あなたの助けをhttps://3v4l.org/F5LND

関連する問題