0

可能重复:
Regex / Preg:不匹配,如果找到

如果字符串中的某些内容不存在,我想用它preg_replace来替换某些字符串。也就是说,如果子字符串存在,则不会匹配该字符串。

例如,如果字符串包含.png,它将找不到/匹配它。

example.com/image.png

在这里,它不会找到它,因为字符串包含 line/substring .png

example.com/image

在这里,它会找到它,因为字符串在任何地方都不包含行/子字符串.png


对于那些仍然没有得到我的人。

$result = preg_replace("#http://(.*\S)[Something here that will not match the link if it finds the .png at last]#","<a href='\\1'>\\1</a>","Here is a link that should work http://example.com/; Here is a link that should NOT work http://example.com/image.png")
4

3 回答 3

1

好的,我要在这里冒险了。

首先,您需要一个能够为您找到 URL 的正则表达式。由于您显然也想找到很多无效的 URL,我们将采用一个正则表达式,它只考虑包含序列的任何连续非空格字符的字符串<letter>.<letter>

\b(?=\S*[a-z]\.[a-z])\S+(?=\s|$)

然后我们可以检查这个序列是否以 结尾.png

\b(?=\S*[a-z]\.[a-z])\S+(?=\s|$)(?<!\.png)

现在您可以将其用于替换操作,例如

$result = preg_replace(
    '/\b           # Start at a word boundary
    (?=            # Assert that it\'s possible to match...
     \S*           # any number of non-whitespace characters
     [a-z]\.[a-z]  # followed by an ASCII letter, a dot, a letter
    )              # End of lookahead assertion
    \S+            # Match one or more non-whitespace characters
    (?=\s|$)       # until the next whitespace or end of string
    (?<!\.png)     # unless that match ends in .png/ix', 
    '<a href="\0">\0</a>', $subject);
于 2012-09-16T15:49:18.833 回答
0

这将是我解决问题的方式,让“非”RegExp 正常工作是相当棘手的——因为它并不是系统的真正设计目的。因此,改为将逻辑分开,以便您有两个 RegExp... 一个搜索类似链接的结构,然后一个检查您想要避免的情况:

function replaceWithLink ( $find ) {
  list($link) = $find;
  if ( preg_match('/\.(png|gif|image)$/', $link) ) {
    return $link;
  }
  else {
    return '<a href="'.$link.'">'.$link.'</a>';
  }
}

$text = 'This is my test string that contains a url.like/thing but '.
        'it also contains another url.like/thing/that-has-an.image '.
        'should they all be highlighted?';

$expr = '#[a-z0-9:_\-\.]+/[a-z0-9_\-\./]+#i';
$func = 'replaceWithLink';

$text = preg_replace_callback($expr, $func, $text);

上面的内容比使用一个过于复杂的 RegExp 更具可读性,并且易于扩展以处理更多扩展。显然,为了让它与 URL 一起正常工作,您可能需要调整正在搜索它们的 RegExp - 我只是很快地将一个组合在一起。在我的版本中,URL 必须包含URL-like text, 后跟/, 后跟URL-like text possibly with slash才能符合条件。

于 2012-09-16T15:45:27.127 回答
0

这个怎么样:

$yourInputString = 'whatever';
$matchPattern = '/^.*?(?<!\.png)$/i';
$replacePattern = '$0.png';
$result = preg_replace($matchPattern, $replacePattern, $yourInputString);

请注意,您的输入字符串将只需要包含您正在处理的链接,例如:

example.com/image.png

或者

example.com/image

以下是模式的解释:

# ^.*?(?<!\.png)$
# 
# Options: case insensitive
# 
# Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
# Match any single character that is not a line break character «.*?»
#    Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
# Assert that it is impossible to match the regex below with the match ending at this position (negative lookbehind) «(?<!\.png)»
#    Match the character “.” literally «\.»
#    Match the characters “png” literally «png»
# Assert position at the end of a line (at the end of the string or before a line break character) «$»
于 2012-09-16T15:55:28.743 回答