删除HTML响应中的新行/空格/制表符

时间:2012-03-07 13:38:05

标签: php regex

假设我有这个HTML,我无法对其执行正则表达式以找到值(至少我是这么认为),因为它有新行,但我需要搜索类似name="hf" value="(.*?)"的内容。

HTML回复

  <input type="hidden"
         name="hf"
         value="123">

当我尝试$response = str_replace('\r\n', $response, '');$response = str_replace('\n', $response, ''); $response变为空字符串时。我有什么选择?

3 个答案:

答案 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"
}