正则表达式帮助(在hr标签之间提取数据)

时间:2011-03-27 23:01:47

标签: php regex

我正在尝试在PHP CMS中提取TinyMCE中的预告文本。我的设计中未使用<hr />标记,因此我希望在以下方案中提取文本,前提是内容管理员仅使用它们来定义Teaser文本:

  1. <hr />代码之前提取内容(在内容管理员在RTE开头输入预告文本然后使用<hr />作为cuttof点的情况下)

  2. 在2个<hr />代码之间提取内容(在内容管理员在内容中的任何位置输入预告文字的情况下,并在两侧标有<hr />个标记。

  3. 我应该用什么正则表达式来涵盖上述内容?

3 个答案:

答案 0 :(得分:0)

我不确定我是否正确地提出了您的问题,但这是一次尝试:

if (preg_match('~^(.*?)<hr />((.+?)<hr />)?~is', $test, $matches)) {
  // at least one <hr /> present

  if (empty($matches[2])) {
    // no second <hr />
    $teaser = $matches[1];

  } else {
    // there is a second <hr />
    $teaser = $matches[3];
  }
} else {
  // no teaser
  $teaser = "";
}

答案 1 :(得分:0)

<?php

$strs = array(
   'GET ME A <hr /> bla',
   'Bla bla<hr /> GET ME B <hr />'
);

foreach($strs as $str) {

    $a = preg_match_all('/(<hr \/>)?(?P<teaser>.*?)<hr \/>/', $str, $matches);

    var_dump($a, $matches);

}

Ideone

输出

int(1)
array(4) {
  [0]=>
  array(1) {
    [0]=>
    string(15) "GET ME A <hr />"
  }
  [1]=>
  array(1) {
    [0]=>
    string(0) ""
  }
  ["teaser"]=>
  array(1) {
    [0]=>
    string(9) "GET ME A "
  }
  [2]=>
  array(1) {
    [0]=>
    string(9) "GET ME A "
  }
}
int(2)
array(4) {
  [0]=>
  array(2) {
    [0]=>
    string(13) "Bla bla<hr />"
    [1]=>
    string(16) " GET ME B <hr />"
  }
  [1]=>
  array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(0) ""
  }
  ["teaser"]=>
  array(2) {
    [0]=>
    string(7) "Bla bla"
    [1]=>
    string(10) " GET ME B "
  }
  [2]=>
  array(2) {
    [0]=>
    string(7) "Bla bla"
    [1]=>
    string(10) " GET ME B "
  }
}

答案 2 :(得分:0)

这个经过测试的功能可以解决这个问题:

function get_teaser($text) {
    // First count how many <hr/> tags there are.
    $count = preg_match_all('%<hr\s*/?>%i', $text, $matches);
    if (!$count) return ''; // None? return empty string.
    switch($count) {
    case (1): // Case I: From start up to only HR tag.
        preg_match('%^(.*?)<hr\s*/?>%si', $text, $matches);
        return $matches[1];
        break;
    case (2): // Case II: Stuff between two HR tags.
        preg_match('%<hr\s*/?>(.*?)<hr\s*/?>%si', $text, $matches);
        return $matches[1];
        break;
    default: // Case III: Three or more HR tags is an error.
        return 'Error! Too many <hr /> tags.';
    }
}

这也允许各种HR标签形式:例如<hr><hr/><hr />