2016-11-29 18 views
1

私はのユーザのページに基づいてhreflangタグを出力するように取り組んでいます。現在、私はpreg_match()を使用して、特定のパターンに再度要求されたURLを照合しています。私はページwww.mydomain1.com/en-gb/companyを訪問するとき、それは上記のタグを出力hreflangの正規表現preg_match()

<?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; ?> 

:それは出力に関連するタグと一致した場合...

だから私はこのような何かを持っています。別のURL 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; ?> 

は、しかし、このページが出力されます最初 if statementから hreflangtagsのすべて、決して第二に入ります。私は regular Expressionが間違っていることを知っていますが、正確にどこを指摘することはできません。私は解決するために何か助けていただければ幸いです。

答えて

1

あなたは否定先読みを使用して/statsと続いたときにen-gb/companyにマッチするのを避けるために最初の正規表現を制限することがあります。

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/にのみ等しい入力と一致します。

+0

あなたのソリューションをありがとう、それは良いようです - それに関する1つの質問...私は例えば/会社/ aboutと/会社/連絡先などのように多くの子ページがある場合私は追加する必要があります複数の「否定的な先読み」??? – Javacadabra

+0

これは、除外したい内容によって異なります。入力の最後にある '/ en-gb/company'と最初の正規表現をマッチさせたい場合は、パラディンの解法(' preg_match( "/^\/en-gb \会社\ /?$/i "、$ url)')。しかし、はい、代替案を追加することができます: '(?!\ /(?:stats | contact | etc)(?:\/| $))' –

2

は、このようなエンドオペレータ$でそれを試してみてください。

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

、あなたのコードでは、毎回、あなたのURL EN-GB /会社と開始それはあなたの最初のコードをヒットします。あなたの2番目のURLもen-gb/companyで始まるので、マッチングを伝える必要があります。