0

URLを解析するために、初めて正規表現を詳しく調べました。あまり深く掘り下げることなく、基本的にわかりやすいURLが必要で、各パーマリンクをデータベースに保存していますが、言語とページの違いのため、1つのパーマリンクのみを保存してページと言語のURLを解析したいと思います。だから私がこのようなものを手に入れているなら:

http://domain.com/lang/fr/category/9/category_title/page/3.html

私が本当に欲しいのは、このビット「category / 9 / category_title」で、自分がどのページにいるかを知ることです。私はこの関数を思いついた:

$return = array();

$string = 'http://domain.com/lang/fr/category/9/category_title/page/3.html';

//Remove domain and http
$string = preg_replace('@^(?:http://)?([^/]+)@i','',$string);

if(preg_match('/^\/lang\/([a-z]{2})/',$string,$langMatches)) {
 $return['lang'] = $langMatches[1];
 //Remove lang
 $string = preg_replace('/^\/lang\/[a-z{2}]+/','',$string);
} else {
 $return['lang'] = 'en';
}

//Get extension
$bits = explode(".", strtolower($string));
$return['extension'] = end($bits);

//Remove extension
$string = preg_replace('/\.[^.]+$/','',$string);

if(preg_match('/page\/([1-9+])$/',$string,$pageMatches)) {
 $return['page'] = $pageMatches[1];
 //Remove lang
 $string = preg_replace('/page\/[1-9+]$/','',$string);
} else {
 $return['page'] = 1;
}

//Remove additional slashes from beginning and end
$string = preg_replace('#^(/?)|(/?)$#', '', $string);

$return['permalink'] = $string;

print_r($return);

上記の例からこれを返します:

Array
(
    [lang] => fr
    [extension] => html
    [page] => 3
    [permalink] => category/9/category_title
)

これは完璧で、まさに私が欲しいものです。しかし、私の質問は、正規表現を正しく使用することについて行ったのかということです。これを行うためのより良い方法はありますか?たとえば、ドメイン、拡張機能、および最初と最後の追加のスラッシュを1つのキックアス式で削除できますか?

4

3 に答える 3

2

parse_urlURLをそのコンポーネントに分割するために使用する必要があります。また、URLパスがある場合はexplode、パスをそのセグメントに分割したり、array_slice特定のセグメントpathinfoを取得したり、拡張子を取得したりするために使用できます。

于 2010-07-24T12:51:52.720 に答える
0

以下の式は、うまくいけばプログラミング言語に依存しません。

^.*?\\.[^/]+/[^/]+/([^/]+)/([^/]+/[^/]+/[^/]+)/.*(\\d+)\\.(\\w+).*$

これが何をするのか説明させてください。

私は行全体(^と$で固定されている)を消費し、最初は最後の「。」に向かって作業します。ドメイン内の文字。そこから、ドメインの最後の要素と最初のパス要素を、各要素に続く「/」区切り文字とともに消費します。次に、キャプチャグループを使用して言語フィールドを取得し、パスの次の3つの要素セグメントを破棄します。ファイル名の先頭に移動し、さらに2つのグループを使用して、ファイル名と拡張子をキャプチャし、行の末尾に空白がある場合はそれを破棄します。

注意点として、上記の式の最小限のテストを実行しましたが、ASCII範囲の文字で構成されるほとんどのURLを処理できると考えています。また、URLの構造に非常に固有であり、複数行のURLを処理しません。

于 2010-07-24T17:44:12.493 に答える
0

PHPにはparse_url関数があります。

特に正規表現を使用するのではなく、この方法を強くお勧めします。

于 2010-07-24T12:53:25.623 に答える