2012-10-12 49 views
0

我該怎麼做?例如,我有這樣的文字(這是一個源代碼):如何搜索字符串並獲取值?

Welcome to asdfasdf, <h2>Welcome</h2>, <a href="index.php?my_id=1">Homepage</a>, 
<br />, Hi, this is some text. 
Check <a href="index.php?my_id=12945">this link</a> or 
<a href="index.php?my_id=138>this link</a> for more information. 
<br /><strong>Thanks</strong> 

現在我想用PHP搜索這個字符串「添加my_id」,並顯示所有的ID。所以輸出將是:

1 
12945 
138 

希望你能理解我。謝謝!

回答

2

這是:

<?php 

$str='Welcome to asdfasdf, <h2>Welcome</h2>, <a href="index.php?my_id=1">Homepage</a>, 
<br />, Hi, this is some text. 
Check <a href="index.php?my_id=12945">this link</a> or 
<a href="index.php?my_id=138>this link</a> for more information. 
<br /><strong>Thanks</strong>'; 


$res = array(); 
preg_match_all('~<a[^>]*?\?my_id=([0-9]+)[^>]*?>~uis', $str, $res); 

print_r($res); 

我的正則表達式是不是很嚴格,但它是必需的ires?my_id = 123會出現在<a>標記內。

+0

@Jordy,把我的正則表達式它的工作HTML解析器我加入,將不包括這種情況下 – hakre

+0

。 @Jordy,如果你想成爲不那麼嚴格,試試這個: preg_match_all( '〜\添加my_id =([0-9] +)〜UIS?',$海峽,$水庫); 這將找到IDS中的任何位置。串。 – DamirR

0
preg_match_all("~my_id=(\d+)\">~", $html, $match); 
print_r($match[1]); 

preg_match_all會給你每場比賽,而不只是一個喜歡的preg_match。 正則表達式將查找my_id =,然後在它後面對數字進行繪圖。如果你擔心在任何地方可能有空白空間,請確保你在正則表達式中輸入\ * *

1

這會給你所有數字,直到第一個非數字字符「添加my_id =」 字符串

$pattern = "@my_id=(\d+)@i"; 
preg_match_all($pattern, $inputString, $matches); 

你會發現在$匹配[1]符合條件的商品;

3

你可以在你的HTML字符串運行正則表達式與preg_match_all提取分離數值:

$ids = preg_match_all('/\b\d+\b/', $html, $m) ? $m[0] : FALSE; 

爲您提供了$ids以下結果:

array(3) { 
    [0] => 
    string(1) "1" 
    [1] => 
    string(5) "12945" 
    [2] => 
    string(3) "138" 
} 

但是,一般的說法是,你應該使用HTML解析器來獲得這些值:

$ids = array_reduce(
    simplexml_import_dom(@DomDocument::loadHTML($html))->xpath('//a/@href') 
    , function($a, $v) {parse_str(parse_url($v, 6), $m); @($m = $m['my_id']) ? $a[] = $m : 0; return $a;} 
); 

這給出了相同的結果,但它會剛好查看a標記的href屬性,然後解析URL並僅返回my_id查詢值(如果它在此URL中設置的話)。

相關問題