2016-11-29 51 views
1

我正在致力于php script以根据用户所在的页面输出一个hreflang标签。目前,我正在使用preg_match()来匹配再次请求特定模式的网址。如果匹配输出的相关标签...正则表达式preg_match()for hreflang

所以我有这样的事情:

<?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页它输出上面的标签。我也有另一个URL www.mydomain1.com/en-gb/company/stats。所以我写了另一块为这个网址:

<?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是错误的,但我无法准确确定在哪里。我会很感激任何帮助,以解决。

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

regex demo

(?!\/stats(?:\/|$))排除模式将会失败所遵循的/en-gb/company所有匹配:

回答

1

时使用/stats负前瞻跟从你可能会限制第一正则表达式来避免匹配en-gb/company在输入结束时使用/stats//stats

注意,如果你只是想检查与第一正则表达式的整个路径,你可以通过添加$结束串锚使用Paladin76 approach,但我也想在末尾添加一个可选的/

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

参见this regex demo

现在,这种图案将只匹配那些只有等于或/en-gb/company/en-gb/company/输入。

+0

谢谢你的解决方案,它似乎很好 - 关于它的一个问题...如果我有很多子页面,例如'/ company/about'和'/ company/contact'等,我是否需要添加多个'负面望远'??? – Javacadabra

+0

这取决于你想要排除什么。如果你只是希望匹配输入结尾的'/ en-gb/company'和第一个正则表达式,使用Paladin的解决方案(可能会修改为'preg_match(“/^\/en-gb \/company \ /?$/i“,$ url)')。但是,您可以添加其他选项:'(?!\ /(?: stats | contact | etc)(?:\/| $))' –

2

与最终操作$这样试试:

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

所以,在你的代码,每次,您的网址开始与EN-GB /公司会打你的第一个代码。你的第二个网址也以en-gb/company开头,所以你需要告诉匹配,它在公司进入你的代码后结束。