1

次の文字列を想像してください

http://somedomain.com
<p>http://somedomain.com</p>
<a href="http://somedomain.com">http://somedomain.com</a>

それを変換する関数または正規表現が必要です。

<a href="http://somedomain.com">http://somedomain.com</a>
<p><a href="http://somedomain.com">http://somedomain.com</a></p>
<a href="http://somedomain.com">http://somedomain.com</a>

<p>問題は、私が見つけたすべての解決策が、3 行目で既にリンクされている URL を壊すか、タグ内の URL をリンクしないことです。

PHP ソリューションがあればよいのですが、必須ではありません。

4

1 に答える 1

1

テストケースに合格する正規表現は次のとおりです-PHPではなく、残念ながら.Net構文です

(?<=(?:[^a-z0-9]|^))(?<!href=["'])([a-z0-9]+:\/\/[^\s<>\(\)\[\]'"]+)(?=[\s<>\(\)\[\]'"])(?!</a>)

そして置換文字列:

<a href='$1'>$1</a>

内訳と説明

正規表現は 5 つの部分で構成されています。

  1. (?<=(?:[^a-z0-9]|^))
    • ポジティブ ルック ビハインド アサーション - URL の前に非プロトコル文字がある (または文字列の先頭である)
  2. (?<!href=["'])
    • ネガティブ ルック ビハインド アサーション - URL の前に href 属性がありません
  3. ([a-z0-9]+:\/\/[^\s<>\(\)\[\]'"]+)
    • URL を取得します
    • 括弧で囲まれたグループなので、置換式で使用できます
    • これは非常に単純な URL マッチング式です。プロトコルの後に が続き://、その後に 1 つ以上の「非 URL」文字が続きます。もっと良いものに交換した方がいいかもしれません。
  4. (?=[\s<>\(\)\[\]'"])
    • 肯定先読みアサーション - URL の後に URL 以外の文字が続く
  5. (?!</a>)
    • 否定先読みアサーション - URL の後に終了</a>タグがありません
于 2013-03-01T09:07:27.197 に答える