2016-11-29 132 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開頭,所以你需要告訴匹配,它在公司進入你的代碼後結束。