如何捕获两个标记之间的文本?正则表达式 PHP


How to capture text between two markers? regex php

我想捕获<a href="tag/hourse">hourse</a>之间的文本

.HTML

<div class="tags">
  <a href="tag/hourse">hourse</a>
  <a href="tag/pik">pik</a>
  <a href="tag/turtle">turtle</a>
  <a href="tag/pillot">pillot</a>
  <a href="tag/glass">glass</a>
  <a href="tag/dog">dog</a>
  <a href="tag/cat">cat</a>
  <a href="tag/fish">fish</a>
</div>

我的正则表达式

preg_match_all("/<div's*class="tags">'s*<a'shref=".*"'s*>(.*)</a>/i", $html, $arr);

它无法正常工作,因为它只捕获第一个数据"小时",而不是随后的"pik、等"。还有别的办法吗?

p.d:我知道使用正则表达式来捕获html标签不是一个好主意,但我想知道这个例子是否有解决方案。

试试这个

$str = '<div class="tags">
  <a href="tag/hourse" class="cloud-2">hourse</a>
  <a href="tag/pik" class="cloud-4">pik</a>
  <a href="tag/turtle" class="cloud-2">turtle</a>
  <a href="tag/pillot" class="cloud-2">pillot</a>
  <a href="tag/glass" class="cloud-1">glass</a>
  <a href="tag/dog" class="cloud-2">dog</a>
  <a href="tag/cat" class="cloud-2">cat</a>
  <a href="tag/fish" class="cloud-1">fish</a></div>';

preg_match_all('/'<a href=".*"'>(.*)'<'/a'>/', $str, $matches);

$matches[1]将包含您查找的字符串

正则表达式不应该用于这种任务,但在简单的代码中,你会很好地使用正则表达式模式

(?<=>)[^<>]*?[^'s<>][^<>]*?(?=<)

PHP代码将是然后

preg_match_all('/(?<=>)[^<>]*?[^'s<>][^<>]*?(?=<)/', $str, $matches);

在此处查看演示。

每行的正则表达式检查的默认值,而不是所有内容,然后您可以使用此正则表达式来捕获小时、pik、或其他:

preg_match_all("/tag'/(['w_]+)/", "content of inputs", $matches);
return
Array
(
    [0] => Array
        (
            [0] => tag/hourse
            [1] => tag/pik
            [2] => tag/turtle
            [3] => tag/pillot
            [4] => tag/glass
            [5] => tag/dog
            [6] => tag/cat
            [7] => tag/fish
        )
    [1] => Array
        (
            [0] => hourse
            [1] => pik
            [2] => turtle
            [3] => pillot
            [4] => glass
            [5] => dog
            [6] => cat
            [7] => fish
        )
)
你可以

使用 DOMDocument,比如:

$dom = new DOMDocument; @$dom->loadHTMLFile('yourFile.php');
// for XML use @$dom->load('yourfile.rss') file extension may differ
function getElementsByClassName($domDoc, $className){
  $all = $domDoc->getElementsByTagName('*');
  foreach($all as $e) {
    if(!$e->hasAttribute('class')){
      continue;
    }
    if(!in_array($className, preg_split('/'s+/', $all->getAttribute('class')))){
       continue;
    }
    $r[] = $e;
  }
  return $r;
}
$tags = getElementsByClassName($dom, 'tags'); $result = '<dl>';
foreach($tags[0]->childNodes as $c){
  if($c->nodeType === 1){
    $result .= "<dt>{$c->textContent}</dt><dd>{$c->getAttribute('href')}</dd>";
  }
}
$result .= '</dl>';
echo $result;