假设我有这个HTML,我无法对其执行正则表达式以找到值(至少我是这么认为),因为它有新行,但我需要搜索类似name="hf" value="(.*?)"
的内容。
HTML回复
<input type="hidden"
name="hf"
value="123">
当我尝试$response = str_replace('\r\n', $response, '');
或$response = str_replace('\n', $response, '');
$response
变为空字符串时。我有什么选择?
答案 0 :(得分:1)
好的,首先你要以错误的顺序将参数传递给str_replace
。
str_replace($search, $replace, $subject)
您的主题是'',并且您正在用您的回复替换'\ n'(不存在)。所以结果一无所获。
其次'\ n'不会给你换行。您需要使用双引号来处理转义字符。
str_replace("\n", '', $response);
这会修复原始代码。
最后你应该使用DOMDocument
来处理HTML,而不是正则表达式。养成正确行事的好习惯,从长远来看,这将节省您的时间和麻烦。
问题How to parse and process HTML with PHP?在这个问题上非常全面。
Grabbing the href attribute of an A element还提供了一些代码示例。
答案 1 :(得分:0)
正则表达式有你可以使用的修饰符 - 有“m”和“s”告诉它将它解析为多行字符串或单行。对于你来说,第二个可能是更好的选择:
preg_match('/name="hf" value="(.*?)"/s',$htmlString,$matches);
答案 2 :(得分:0)
强烈建议使用DOM解析而不是容易出错的正则表达式来获得这种HTML解析的解决方案。
以下是基于DOM的代码,您可以使用它来提取输入项的值:
$html = <<< EOF
<input type="hidden"
name="hf"
value="123">
EOF;
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html); // loads your html
echo $doc->saveHTML();
$xpath = new DOMXPath($doc);
// returns a list of all inputs with name='hf'
$nodelist = $xpath->query("//input[@name='hf']");
for($i=0; $i < $nodelist->length; $i++) {
$node = $nodelist->item($i);
$value = $node->attributes->getNamedItem('value')->nodeValue;
var_dump($value); // prints "123"
}