2009-12-13 174 views
0

我怎樣才能得到41P86246HOH7C1G4A983321910HDL63U9從的preg_matchPHP的preg_match問題

輸入類型= 「文本」 值= 「41P86246HOH7C1G4A983321910HDL63U9」 ID = 「」

+2

'的preg_match(「41P86246HOH7C1G4A983321910HDL63U9」,$海峽,$匹配「);' – 2009-12-13 18:43:41

+3

現在它看起來像你試圖解析使用正則表達式的HTML,這是一個巨大的無糖?編號 – 2009-12-13 18:45:14

+0

@Anon:你的例子因爲你忘了分隔符而不起作用;;) – Gumbo 2009-12-13 18:51:08

回答

0

像這樣的東西:

if(preg_match('@value="([^"]*)"@', $text, $m)){ 
    echo $m[1]; 
} 

但你也可以做的東西誰在這個值每個鍵拆分字符串。

function attributes($text){ 
    $attrs = array(); 

    if(preg_match_all('@(\b[^=]*\b)\s*=\s*"([^"]+)"@', $text, $matches, PREG_SET_ORDER)){ 
     foreach($matches as $m){ 
      $attrs[$m[1]] = $m[2]; 
     } 
    } 

    return $attrs; 
} 

// Use like this 
$attrs = attributes('input value="bla"'); 
if(isset($attrs['value'])){ 
    echo $attrs['value']; 
} 
+0

非常感謝VDVLeon你的方式是真棒 – 2009-12-13 18:53:52

3

什麼像這樣如下:

$str = 'input type="text" value="41P86246HOH7C1G4A983321910HDL63U9" id=""'; 
$m = array(); 
if (preg_match('#value="([^"]+)"#', $str, $m)) { 
    var_dump($m[1]); 
} 

這將匹配value附帶的雙引號之間的所有內容,併爲您提供:

string '41P86246HOH7C1G4A983321910HDL63U9' (length=33) 


但是,作爲一個旁註:如果你想「解析」 HTML與正則表達式,它通常不是「最好」的方式; HTML是不是很夠的正則表達式規則...

+0

okz讓我檢查 – 2009-12-13 18:45:42

+0

但我只想要41P86246HOH7C1G4A983321910HDL63U9沒有額外的字符 – 2009-12-13 18:48:46

+0

你會得到什麼「額外字符」?我發佈的正則表達式只給了... U9作爲結果;;其他信息顯示在我的答案中的字符串是var_dump的輸出(安裝了Xdebug)。 – 2009-12-13 18:54:19

6
DOMDocument::loadHTML("<$input>")->getElementsByTagName('input') 
    ->item(0)->getAttribute('value'); 
2

簡單,沒有多餘的字符:

preg_match('/(?<=value=")[0-9A-Za-z]+/', $str, $match); 

你的結果是$match[0];

+0

斷言FTW! – Kornel 2009-12-16 19:34:40

0

甚至不必使用正則表達式。只要使用PHP的字符串方法

$str='input type="text" value="41P86246HOH7C1G4A983321910HDL63U9" id=""'; 
$s = explode(" ",$str); 
// go through each element, find "value" 
foreach($s as $a=>$b){ 
    if(strpos($b,"value")!==FALSE){ 
     $find = explode("=",$b); 
     print $find[1]; 
    } 
}