hreflang的正则表达式preg_match()

时间:2016-11-29 14:15:22

标签: php regex

我正在使用php script根据用户所在的页面输出大量hreflang个标签。目前我正在使用preg_match()来再次匹配请求的URL特定模式。如果匹配输出相关标签......

所以我有这样的事情:

<?php if (preg_match("/^\/en-gb\/company/i", $url)): ?>
    <link rel="alternate" href="https://www.mydomain1.com/en-gb/company/" hreflang="en-gb" />
    <link rel="alternate" href="https://www.mydomain1.com/company/" hreflang="en" />
    <link rel="alternate" href="https://www.mydomain1.com/company/" hreflang="x-default" />
<?php endif; ?>

当我访问页面www.mydomain1.com/en-gb/company时,它会输出上述标签。我还有另一个网址www.mydomain1.com/en-gb/company/stats。所以我为这个URL写了另一个块:

   <?php if (preg_match("/^\/en-gb\/company\/stats/i", $url)): ?>
        <link rel="alternate" href="https://www.mydomain1.com/en-gb/company/stats" hreflang="en-gb" />
        <link rel="alternate" href="https://www.mydomain1.com/company/stats" hreflang="en" />
        <link rel="alternate" href="https://www.mydomain1.com/company/stats" hreflang="x-default" />
    <?php endif; ?>

但是,此页面将输出第一个hreflangtags中的所有if statement,而不会输入第二个regular Expression。我知道我的ansible.cfg错了,但我无法准确找到确切的位置。我很感激任何帮助以便解决。

2 个答案:

答案 0 :(得分:2)

尝试使用结束运算符$,如下所示:

<?php if (preg_match("/^\/en-gb\/company\/$i", $url)): ?>

因此,在您的代码中,每次使用en-gb / company,您的网址启动时,它都会显示您的第一个代码。你的第二个网址也是以en-gb / company开头的,所以你需要告诉匹配,它会在公司之后结束你的代码。

答案 1 :(得分:1)

您可以限制第一个正则表达式,以避免在使用否定前瞻跟随en-gb/company时匹配/stats

preg_match("/^\/en-gb\/company(?!\/stats(?:\/|$))/i", $url)
                              ^^^^^^^^^^^^^^^^^^^ 

请参阅regex demo

(?!\/stats(?:\/|$))否定前瞻将导致/en-gb/company的所有匹配在输入结束后跟/stats//stats失败。

请注意,如果您只想使用第一个正则表达式检查整个路径,可以通过添加$字符串结尾锚点来使用Paladin76 approach,但我也在最后添加了一个可选的/

preg_match("/^\/en-gb\/company\/?$/i", $url)
                              ^^^^

请参阅this regex demo

现在,此模式仅匹配仅等于/en-gb/company/en-gb/company/的输入。