将另一个正则表达式添加到现有表达式

Add another regular expression to an existing expression

我不熟悉正则表达式。我正在尝试理解它,但这很难。

我有一个正则表达式,可以将任何 URL 包装在锚标记中。但是,它还包装了已经在锚标记中的 URL。我想避免这种情况,所以我找到了一个正则表达式来为我做这件事。

?![^<]*</a>

但是,我不知道如何将它添加到我现有的正则表达式中。这是我当前的正则表达式:

preg_replace('!(((ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '<a href="" target="_blank"></a>', $text); ?>

那么,如何跳过已经包含在锚标记中的 URL?

我要加入合唱团并说:不要为此使用正则表达式 - 使用 html 解析器

这就是说 - 您发现 的正则表达式本身并不是真正的正则表达式。 检查您是否处于锚定状态,这是负面预测的一部分。 (它实际上应该是 (?![^<]*</a>)。)它会检查下一个 <(或结尾)之后的文本后面是否没有 </>

将此附加到原始 RE 的末尾 有时 可以达到目的。我不会花时间思考它会失败的情况 - 但它可能会失败。

除了一些简化之外,您的正则表达式应该如下所示:

(https?:\/\/[-\wа-яА-Я()@:%+.~#?&;\/=]+)(?![^<]*<\/a>)

这可能对您有用大部分,但有时也会失败。

此致