【问题标题】:javascript - Find multi occurences inside a RegExp by Groupjavascript - 按组在 RegEx 中查找多次出现
【发布时间】:2018-08-07 07:33:24
【问题描述】:

我得到了这种 HTML 结构:

<p>TEST</p><ul><li>1 abc</li><li>2 def</li><li>3 ghi</li></ul>

我想得到这个:

 - Group 1 : TEST 
 - Group 2 : 1 abc 
 - Group 3 : 2 def  
 - Group 4 : 3 ghi

所以我写了这个reg exp:

<p>(.*?)<\/p>.*?<ul>(?(1)<li>(.*?)<\/li>*)<\/ul>

结果是:

Match 1
Full match  0-50    `<p>TEST</p><ul><li>1</li><li>2</li><li>3</li></ul>`
Group 1.    3-7 `TEST`
Group 2.    19-40   `1</li><li>2</li><li>3`

参照 Regex101 : https://regex101.com/r/eoHtuI/1

这是用 PHP 格式编写的,但我也可以将它与 Javascript 一起使用。 有什么想法吗?

【问题讨论】:

  • 您必须为此使用正则表达式吗? DOM 解析似乎更适合这项任务。
  • 我用它制作了一个 webscrap,但由于我的网络托管商,我无法添加任何模块,所以是的,我必须使用正则表达式。顺便说一句,我也知道我可以使用多个正则表达式,但我正在尝试只用一个来完成所有事情以获得更快的代码。

标签: javascript php regex


【解决方案1】:

您可以拆分每个标签序列(无论如何用于您的示例输入)。

代码:(Demo)

$html = <<<HTML
<p>TEST</p><ul><li>1</li><li>2</li><li>3</li></ul>
HTML;

var_export(
    preg_split('~(?:<[^>]+>)+~', $html, 0, PREG_SPLIT_NO_EMPTY)
);

输出:

array (
  0 => 'TEST',
  1 => '1',
  2 => '2',
  3 => '3',
)

*注意,不推荐使用正则表达式解析 html。这是一个 DomDocument/Xpath 方法(主要来自https://stackoverflow.com/a/25695410/2943403

代码:(Demo)

$dom = new DOMDocument; 
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
foreach ($xpath->evaluate('//*[count(*) = 0]') as $node) {
  $result[] = $node->nodeValue;
}
var_export($result);  // same output as my regex method

【讨论】:

  • 如果这不能满足您的所有用例,您需要改进您的问题并添加更多示例输入。
猜你喜欢
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多