2009-12-13 254 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]; 
    } 
}