1

HTML/テキスト文字列があり、テキストのすべてのリンクのような部分を A タグ付きの実際のハイパーリンクに一致させたいと考えています。この質問では、「www.somesite.domen」パターンに一致させようとしています。しかし、パターンが文末の句読点に近い場合はどうでしょうか。

句読点である最後の文字なしでパターンを一致させる方法は?

  1. www.somesite.domen.
  2. www.somesite.domen、
  3. www.somesite.domen?
  4. www.somesite.domen!
  5. www.somesite.domen/?id=1?

私が使用している関数は次のとおりです。

function make_links($text)
{
  return  preg_replace(
     array(
        '/(^|\s)(www\.[^<>\s!,]+)(!$|\s|\.|\:|\!|,|\?)/iex'
       ),
     array(
        "stripslashes((strlen('\\2')>0?'\\1<a target=\"_blank\" href=\"http://\\2\">\\2</a>\\3':'\\0'))"
       ),
       $text
   );
}

しかし、「。」また '?' 文字は文の最後です。私の機能はそれらをリンクにも取り入れています。

このケースを解決する方法はありますか?ありがとう!

4

1 に答える 1

0

私があなたの要件を正しく理解している場合は、テキスト行を 3 つのグループに分ける必要があります

  • 最初のグループは、ホスト名の前にテキストを保持します
  • 2 番目のグループはホスト名を保持します
  • 3 番目のグループは句読点文字 (または空白文字) の最後になります。

解決策の 1 つとして、次のようなものがあります。

/^(.*?)(www(?:.\w+)+(?:\/[^.\s]+?))(!$|\s|\.|\:|\!|,|\?)?$/

正規表現の説明

例として使用some text www.host.some-site.domen/?id=1?すると、次のように一致します。

マッチング結果

正規表現をいじるために、regex101.comを使用できます。

編集

あるいは、これは別の正規表現です。

/^(.+\s)?(\w+(?:\.[-\w]+)+\.\w+(?:\/.*?)?)(!$|\s|\.|\:|\!|,|\?)?$/

私はいくつかのテストを実行しました:

  • テスト テキスト: some stuff www.host.somesite.domen/?id=1.. 一致するグループ:

    • 1: some stuff
    • 2: www.host.somesite.domen/?id=1
    • 3:.
  • テスト テキスト: some stuff www.host.somesite.domain.. 一致するグループ:

    • 1:some stuff
    • 2:www.host.somesite.domen
    • 3:.
  • テスト テキスト: www.host.somesite.domain. 一致するグループ (1 つだけ):

    • 2:www.host.somesite.domain
  • テスト テキスト: hello www.host.somesite.domen/mysite.. 一致するグループ:

    • 1: hello
    • 2: www.host.somesite.domen/mysite
    • 3:.
  • テスト テキスト: www.somesite.domen/?id=1?. 一致するグループ:

    • 2:www.somesite.domen/?id=1
    • 3:?

問題の解決に役立つことを願っています。

于 2013-01-16T11:39:22.687 に答える