【问题标题】:preg_match_all occurrences inside of a tag标记内的 preg_match_all 出现
【发布时间】:2014-01-09 01:17:15
【问题描述】:

我在http://regex101.com/ 上练习了很多,但我这辈子都无法正确预赛。

我正在尝试从多个标签中获取部分 onclick 函数,但这只会弄得一团糟。

<a href="https://URL" onclick="return ajax({code:'page/97b7a6651b9f3f3H',form_id:'id456',top:0,update_id:'inner-container'});" class="get-button" target="_top"><span class="button"><span class="icon">&nbsp;</span>Attack</span></a>

<a href="https://URL" onclick="return ajax({code:'page/97b7a6651b96c6b7e398f',form_id:'id123',top:0,update_id:'inner-container'});" class="get-button" target="_top"><span class="button"><span class="icon">&nbsp;</span>Attack</span></a>

它像这样返回 -> 3dc061fb74fe59orm_id:'bounty_attack_form_515998115'});" class="get-button" target="_top"> 攻击

我只想要 97b7a6651b9f3f3H 和 97b7a6651b96c6b7e398f。

我尝试了多种方法,我知道这个 php 代码是错误的,但这就是我所拥有的。 preg_match_all("/ge/(.*)',f/", $server_output, $matches); $remove = array("ge/","',f");

foreach ($matches[0] as $match) 
{ 
$match = str_replace($remove, "", $match);
    echo '[ ' . $match . ' ]<br>'; 
} 

【问题讨论】:

  • 我已经在regex101.com 上练习了很多,但我这辈子都无法正确地进行预赛......还没有练习很多! :-)
  • 说真的,您不需要使用 preg_match 来查找某些内容,然后将其替换为 str_replace。您可以使用 preg_replace 并应用相同的正则表达式规则。 us3.php.net/manual/en/function.preg-replace.php
  • 我只是 str_replacing 因为它留下了我无法正确匹配的额外代码。我查看了您发布的网址,但如果变量并不总是相同,那么我不能这样做。
  • 我们只能用您给我们修复的代码来回答解决方案...
  • 我建议不要使用正则表达式来解析 HTML,试试像 PHP Simple HTML DOM ParserphpQuery 这样的 HTML 解析器

标签: php preg-match-all


【解决方案1】:

我猜有一种更简洁的方法可以做到这一点,但这很有效:

$string = "<a href=\"https://URL\" onclick=\"return ajax({code:'page/97b7a6651b9f3f3H',form_id:'id456',top:0,update_id:'inner-container'});\" class=\"get-button\" target=\"_top\"><span class=\"button\"><span class=\"icon\">&nbsp;</span>Attack</span></a>";

$string .= "<a href=\"https://URL\" onclick=\"return ajax({code:'page/97b7a6651b9f3f3H',form_id:'id456',top:0,update_id:'inner-container'});\" class=\"get-button\" target=\"_top\"><span class=\"button\"><span class=\"icon\">&nbsp;</span>Attack</span></a>";

preg_match_all("/code:\'page\/(.*?)\'/", $string, $matches);

foreach ($matches as $match) {
    if (isset($match[1])) {
        $codes[] = $matches[1];
    } 
}

var_dump($codes);

查看实际操作: http://ideone.com/YkIWig

如果有人比我更聪明的正则表达式想要编辑这个,请做!

【讨论】:

  • 你能把上面的标签加到你的字符串里让我测试一下吗?我确信这是正确的方法,但是当我运行它时,我仍然有一些额外的东西尾随。
  • 如果你的意思是完整的
  • 多个A标签。我可以只用一个,但是当有 10 个或更多时就不一样了。
  • 我现在明白了。在这里, preg_match_all 会发现多次出现。我假设你知道如何遍历多个字符串。
  • 谢谢。这就是我一直在寻找的。我没有这样做 if (isset($match[1])) { $codes[] = $matches[1]; }
【解决方案2】:
preg_match_all("/page\/\K\w*/", $string_to_search, $array);
print_r($array);

完全匹配 page/,\K 删除匹配的部分,然后它允许任意数量的字母或数字,直到遇到非字母或数字,例如 '

结果进入一个数组,可以作为 $array[0][x] 访问

【讨论】:

  • 这是最接近的。谢谢你。我希望我不必删除任何内容。
  • 编辑添加 \K 将自动删除匹配的页面/
  • \K 让它空着回来。
  • 在这里工作:ideone.com/FwilCK 似乎 \K 在 PHP v5.2.4 以下不受支持。
  • 很好。现在我要更新我的 php 版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多