1

次のような文字列から有効な URL を取得する方法を探しています。

$string = 'http://somesite.com/directory//sites/9/my_forms/3-895a3e/somefilename.jpg|:||:||:||:|19845';

私の元の解決策は次のとおりです。

preg_match('#^[^:|]*#', str_replace('//', '/', $string), $modifiedPath);

ただし、明らかに、文字列の途中にあるスラッシュではなく、 http:// からスラッシュを削除します。

オリジナルから期待される出力は次のとおりです。

http://somesite.com/directory/sites/9/my_forms/3-895a3e/somefilename.jpg

最初に文字列の http 部分をいつでも切り離すことができますが、可能であれば正規表現の形式でより洗練されたソリューションが必要です。ありがとう。

4

3 に答える 3

3

これはあなたが求めていることを正確に行います:

 <?php

$string = 'http://somesite.com/directory//sites/9/my_forms/3-895a3e/somefilename.jpg|:||:||:||:|19845';

preg_match('/^([^|]+)/', $string, $m); // get everything up to and NOT including the first pipe (|)
$string = $m[1];

$string = preg_replace('/(?<!:)\/\//', '/' ,$string); // replace all occurrences of // as long as they are not preceded by :

echo $string; // outputs: http://somesite.com/directory/sites/9/my_forms/3-895a3e/somefilename.jpg

exit;

 ?>

編集:

(?<!X)正規表現では、後読みと呼ばれるものの構文です。X は、テスト対象の文字に置き換えられます。

次の式は、二重スラッシュ (/) のすべてのインスタンスに一致します。

\/\/

ただし、探している一致の前に : 文字がないことを確認する必要があるため、一致を「後読み」して、: 文字が存在するかどうかを確認する必要があります。そうである場合、一致としてカウントされないようにします。

(?<!:)\/\/

!は、後読みで一致しないと言っているものです。に変更すると(?=:)\/\/、前に : がある二重スラッシュにのみ一致します。

これは、先読みと後読みのチュートリアルよりもすべてを説明できるクイックチュートリアルです

于 2013-07-26T15:20:51.190 に答える
2

すべての文字列が指定された形式であると仮定すると、これを行うには最も単純な正規表現しか必要ありません。エレガントなソリューションが必要な場合は、正規表現は必要ありません。また、二重スラッシュは、Unix パスと同様に URL で使用でき、単一のスラッシュと同じことを意味するため、それらを取り除く必要はまったくありません。

なぜだけではないのですか

$url = array_shift(preg_split('/\|/', $string));

?

URL の二重スラッシュを本当に本当に気にしている場合は、次のように続けます。

$url = preg_replace('/([^:])\/\//', '$1/', $url);

またはそれらを組み合わせて

$url = preg_replace('/([^:])\/\//', '$1/', array_shift(preg_split('/\|/', $string)));

その最後のフォームは少し毛むくじゃらになりますが.

于 2013-07-26T15:23:00.240 に答える
0

これは非常に厳密に定義された状況であるため、1 つの preg だけが最もエレガントなソリューションであると考えています。

頭のてっぺんから:

$sanitizedURL = preg_replace('~((?<!:)/(?=/)|\\|.+)~', '', $rawURL);

基本的に、これが行うことは、コロン (:) が前になく、IS の後に別のスラッシュが続くスラッシュを探すことです。また、パイプ文字とそれに続く文字も検索します。

見つかったものはすべて結果から削除されます。

必要に応じて、RegEx について詳しく説明できます。

于 2013-07-27T13:06:42.480 に答える