PHP正则表达式匹配所有圣经引用不起作用

时间:2018-05-02 10:34:16

标签: php regex

我正在努力使用正则表达式来匹配正文中的所有圣经引号,以便我可以将它们转换为链接。因为我刚接触正则表达式,所以我希望有人可以帮忙解决这个问题。到目前为止,我正在使用它:

/([^(])\w+ +\d+:+[\d+[?\-]+([^)])/

一些示例文本如下所示:

    Lorem ipsum dolor sit amet, sea persius nonumes habemus cu. Eam ferri dicta ex, sit no torquatos reprimique. Ea tota democritum has, mel libris audiam voluptaria cu. Ex usu facer voluptatibus, nam ut commune democritum. Ea nonumes  (1 John 3:1) recteque sapientem eum. Cum soleat mandamus te, (Matthew 6:6) eos affert volutpat et.

Quo ei iracundia consectetuer. Vim salutatus abhorreant at, quo ea postea equidem intellegam. Duo dicit cotidieque id, debitis noluisse fabellas sit eu. Qui ne integre patrioque, minimum inciderint eos ex, aliquando (Deuteronomy 10:18; Psalm 10:14) tincidunt intellegat est at. Sumo assum et nec, usu graecis adversarium te, cu mea quis lorem. In qui utroque propriae, ex mandamus argumentum vis, pro vidisse ceteros atomorum ex. Et mentitum referrentur

到目前为止,我的正则表达式是单独匹配我的页面中的大多数引号,包括示例文本但(约翰福音3:1)和(马太福音6:6)不起作用。正则表达式需要匹配一个左大括号并从结果字符串中省略它然后匹配一个空格和/或一个单词(书名)后面跟一个空格和一个数字(章节)后面跟冒号(:)然后一个可选数字带有可选短划线( - )和另一个数字(经文)的数字,后面跟一个可选的分号(;)如果有多个引用,后跟一个右括号(从结果匹配中省略它)。为了符合我的愿望标准,我该更新什么?

示例代码:

<?php
$body = "Lorem ipsum dolor sit amet, sea persius nonumes habemus cu. Eam ferri dicta ex, sit no torquatos reprimique. Ea tota democritum has, mel libris audiam voluptaria cu. Ex usu facer voluptatibus, nam ut commune democritum. Ea nonumes  (1 John 3:1) recteque sapientem eum. Cum soleat mandamus te, (Matthew 6:6) eos affert volutpat et.

        Quo ei iracundia consectetuer. Vim salutatus abhorreant at, quo ea postea equidem intellegam. Duo dicit cotidieque id, debitis noluisse fabellas sit eu. Qui ne integre patrioque, minimum inciderint eos ex, aliquando (Deuteronomy 10:18; Psalm 10:14) tincidunt intellegat est at. Sumo assum et nec, usu graecis adversarium te, cu mea quis lorem. In qui utroque propriae, ex mandamus argumentum vis, pro vidisse ceteros atomorum ex. Et mentitum referrentur";

    $template_body = preg_replace_callback(
            '/([^(])\w+ +\d+:+[\d+[?\-]+([^)])/',
            function ($matches) {
                $replacement = '<a href="https://www.biblegateway.com/passage/?search='.$matches[0].';&version=NIVUK">'.$matches[0].'</a>';
                return $replacement;
            },
            $body
        );
?>

2 个答案:

答案 0 :(得分:0)

怎么样:[ (](([0-9] )?[\w]+ [0-9]{1,2}:[0-9]{1,2})[;)]

https://regex101.com/r/Y4nasm/3

<强>详情

[ (]:匹配空格或(

([0-9] )?:可选地匹配数字后跟空格

[\w]+:匹配任何单词字符

[0-9]{1,2}:匹配长度为1或2的数字

[;)]:匹配;(

答案 1 :(得分:0)

你不想在你的比赛中包括括号,因为那将很难匹配“(申命记10:18;诗篇10:14)”中的第二个引用。相反,使用零宽度断言来指定您的匹配应该在(;之前和之后,而不匹配它。 (?<=[(;])代表前缀,(?=[(;])代表后缀。

分号后跟空格,但是括号不是,所以前缀后面有可选的空格(\s*)。这是在括号中,因为它将是表达式中的第一个匹配项,我们将在<a>...</a>标记之前输出它。

我没有改变很多其他的东西。我将替换为\s,以防碰巧有其他空格。我认为不值得限制匹配的数字,但如果你这样做,我至少会使用{1,3},因为有超过100个诗篇,有些章节有很多经文。

在输出中,我建议在链接中编码搜索文本的URL,我删除了一个看似不必要的;字符。

$body =
    "Lorem ipsum dolor sit amet, sea persius nonumes habemus cu. Eam ferri dicta"
    . " ex, sit no torquatos reprimique. Ea tota democritum has, mel libris"
    . " audiam voluptaria cu. Ex usu facer voluptatibus, nam ut commune"
    . " democritum. Ea nonumes  (1 John 3:1) recteque sapientem eum. Cum soleat"
    . " mandamus te, (Matthew 6:6) eos affert volutpat et. Quo ei iracundia"
    . " consectetuer. Vim salutatus abhorreant at, quo ea postea equidem"
    . " intellegam. Duo dicit cotidieque id, debitis noluisse fabellas sit eu."
    . " Qui ne integre patrioque, minimum inciderint eos ex, aliquando"
    . " (Deuteronomy 10:18; Psalm 10:14) tincidunt intellegat est at. Sumo assum"
    . " et nec, usu graecis adversarium te, cu mea quis lorem. In qui utroque"
    . " propriae, ex mandamus argumentum vis, pro vidisse ceteros atomorum ex."
    . " Et mentitum referrentur";

$template_body = preg_replace_callback(
    '[(?<=[(;])(\s*)((\d+\s+)?\w+\s+\d+:\d+(-\d+)?)(?=[);])]',
    function ($matches) {
        $replacement = $matches[1]
            . '<a href="https://www.biblegateway.com/passage/?search='
            . rawurlencode($matches[2]) . '&version=NIVUK">'
            . $matches[2] . '</a>';
        return $replacement;
    },
    $body
);