【问题标题】:Regex Pattern returning an empty Array正则表达式模式返回一个空数组
【发布时间】:2013-01-25 00:12:33
【问题描述】:

我想要完成的是一个相当简单的正则表达式模式,它最终会抓取页面/自定义帖子类型的内容。目前我只是检查一个单行字符串。

以下 RegEx 模式有效(复制并粘贴到 RegExr - http://regexr.com)。

$pattern = "/\[jwplayer(.+?)?\]?]/g"; 
$videoTest = "[jwplayer config=\"top_10_videos\" mediaid=\"107\"]";
preg_match($videoTest, $pattern, $matches);
print_r($matches);`

但是输出如下:

Array
(
    [0] => Array
        (
        )
)

我已经测试了其他正则表达式模式(简单的模式),并且我已经搜索了网络(包括堆栈溢出)来寻找这个特定问题的答案,但没有成功解决这个问题。上面的 php 代码已放置在 WordPress v 3.5 的 functions.php 中,如果该信息有帮助并使用“wp_ajax”钩子调用。 ajax 挂钩按预期工作。

任何人都可以提供的任何帮助都会很棒!

谢谢, 尼克

【问题讨论】:

  • (.+?)? ... ehhh,那应该怎么做?

标签: php wordpress preg-match jwplayer preg-match-all


【解决方案1】:

g 修饰符是 not used in PHP。请改用preg_match_all()

此外,preg_match 的参数顺序错误。参数需要按以下顺序排列:

preg_match($pattern, $videoTest, $matches);

阅读Regular Expressions documentation

一种使用正则表达式从字符串中检索内容的更强大的方法,它尽可能具体。这可以防止畸形的东西通过。例如:

function getJQPlayer($string) {
    $pattern = '/\[jwplayer(?:\s+[\w\d]+=(["\'])[\w\d]+\\1)*\]/';
    preg_match_all($pattern, $string, $matches, PREG_SET_ORDER);
    foreach ($matches as & $match) {
        $match = array_shift($match);
    }
    return $matches ?: FALSE;
}
$videoTest  = "[jwplayer config=\"top_10_videos\" mediaid=\"107\"]";
$videoTest .= ",[jwplayer config=\"bottom_10_videos\" mediaid=\"108\"]";
echo '<pre>', print_r(getJQPlayer($videoTest), true);

【讨论】:

  • 只是对 op 的说明,g 修饰符通常是“全局的”。 preg_match 不是全局的。如果你想要全局,有 preg_match_all。
  • @Sverri - 感谢您指出这一点!现在我按顺序获得了正确的参数,就像一个魅力。不太清楚我是怎么错过的。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多