【问题标题】:What is the regex for php to get the href value in all stylesheet tags from HTML?从 HTML 获取所有样式表标签中的 href 值的 php 正则表达式是什么?
【发布时间】:2014-05-18 19:29:48
【问题描述】:

什么是使用 regex 和 preg_match_all 获取所有 href 标签的一般方法,因为标签并不总是按顺序排列。

例子:

<link href="foo.css" rel="stylesheet" type="text/css"/>
<link type="text/css" href="bar.css" rel="stylesheet"/>
<link rel="stylesheet" type="text/css" href="bar1.css"/>
<link type="text/css" href="bar2.css" rel="stylesheet"></link>
<link href="path/foo.css" rel="stylesheet" type="text/css"/>

应该导致:

Array(
'foo.css',
'bar.css',
'bar1.css',
'bar2.css',
'path/foo.css',
)

【问题讨论】:

  • 一般的方法是不要这样做,而是使用SimpleDOM或类似的东西。
  • 我正在读取仅包含这些元素的文件。谢谢你。 -- 另外,SimpleDOM / etc --- 非常慢,用于完整 HTML 页面的 DOM 处理,而不是用于文件解析。
  • 至于否决的实际原因:Regex is not suitable for parsing HTML,而您在解决问题方面并没有付出太多努力。
  • @FabrícioMatté - 无论有没有标题,最好的问题都会被否决,因为它是匿名的。感谢您为否决投票的理由。虽然正则表达式不适合解析 HTML - 它适用于解析 HTML 段(例如,如果上面是文件的唯一内容,则 DOM 解析将不起作用,因为没有 DOM)。此外,DOM 解析器的使用假定已安装并启用一个解析器。 DOM 解析也很慢,并且只适用于“渲染”的内容。
  • @FabrícioMatté - 通过渲染内容,我的意思是页面被渲染到 DOM 中,并且生成的页面可能与源本身不同。在处理在线页面时,当然 DOM 是更好的解决方案——大多数时候。

标签: php css regex preg-match-all


【解决方案1】:

解析是要走的路:

$x = file_get_contents("foo.txt");
$xml = simplexml_load_string("<links>$x</links>");
$results = array();

foreach ($xml->link as $link)
    $results[] = (string)$link['href'];

看到它的工作:https://eval.in/132898

【讨论】:

  • 有趣的解决方案。 +1 创意:)。这是否适用于内联注释块,例如 和 ?
  • @SanuelJackson 不知道,试着告诉我 :-)
  • 是的。现在要看看它是否跳过了其他东西。 https://eval.in/132982
  • 当内容中混入其他内容时,它会中断。我没有尝试过使用纯文本或 /* */ type block cmets。 https://eval.in/132985 。仍然是一个非常酷的方法——有点作弊,如果您知道文件中根本没有其他内容。
【解决方案2】:

您正在寻找的正则表达式是这样的,但需要进一步完善:

<link\s+(?:[^>]*?\s+)?href="([^"]*)"

测试

<link href="foo.css" rel="stylesheet" type="text/css"/>

返回值为

<link href="foo.css"

这里是测试你的表情的好地方:http://regexpal.com/

【讨论】:

  • 反应很好。您缺少指导跨多个字符串进行递归搜索的参数,但您确实有一个例外,即结束标记终止该行的搜索。
  • &lt;link[^&gt;]* href="([^"]*)" 是我使用的,但它假定 href 用引号括起来。
【解决方案3】:

我会说:

preg_match_all('/href=\"([a-z1-9\/.]+)\"/img', $head, $matches)

【讨论】:

  • 关闭,但您的正则表达式将 href 内的字符限制为 a-z、1-9 和 / 。
  • 不完全是,/i 为您提供不区分大小写的功能,可以使用 _ char,它应该可以捕获大多数 ascii 可能性。
  • 我确实注意到了内联搜索参数,你是对的,我应该说 'A-Z、a-z、1-9、/ 和 .' :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2018-04-30
  • 2011-02-01
  • 1970-01-01
相关资源
最近更新 更多