if(preg_match("/(.*(<code>).*(<\/code>).*)*/", $string))
我已经试了好几个小时了,但我做不到。如果用户格式化的文本格式正确,如:
(any_string*<code>any_string*</code>any_string*)*
只有这样,我才会将文本格式化为*,意思是空字符串,或者很多次。我的表情怎么了?
编辑:,我想匹配lalala text <code>dlalala lala code</code> lalalal
。如果它是lala <code> lalala
或lalal </code> <code> lalala <code>alala
,那么我们就不想匹配它。
发布于 2012-03-08 13:09:05
这适用于两个给定的测试用例:
$arr = array('lalala text <code>dlalala lala code</code> lalalal.',
'lala <code> lalala or lalal </code> <code> lalala <code>alala');
foreach ($arr as $str) {
echo "$str\n";
if (preg_match('#^(?<!<code>).*<code>.*?</code>(?!.*<code>)#', $str)) {
echo "===> Match\n";
} else {
echo "===> Not match\n";
}
}
输出:
lalala text <code>dlalala lala code</code> lalalal.
===> Match
lala <code> lalala or lalal </code> <code> lalala <code>alala
===> Not match
关于正则表达式的一些解释:
# : regex delimiter
^ : begining of string
(?<! : start negative lookbehind
<code> : literally <code>
) : end of lookbehind
.* : any char any number of time
<code> : literally <code>
.*? : any char any number of time not greedy
</code> : literally </code>
(?! : start negative lookahead
.* : any char any number of time
<code> : literally <code>
) : end of lookahead
# : regex delimiter
你可以找到一些有用的关于查找这里的信息。
发布于 2012-03-03 23:28:03
您可能会在代码表达式中使用贪婪杀手?
(这里有更多信息:分隔符之间的匹配文本:贪婪还是懒惰的正则表达式? ),所以如果您有这样的代码:
<code>foo</code> another <code>bar</code>
它将只匹配foo
和bar
而不是foo</code> another <code>bar
,还应该使用preg_match_all()
(带有标志PREG_OFFSET_CAPTURE
)并编写自己的解析器。或者像这样使用preg_replace_callback()
:
// Just strtolower example (this would do formatting)
function myCallback( $matches){
return strlower( $matches[2]);
}
$string = preg_replace_callback("/(<code>).*?(<\/code>)/si", 'myCallback', $string)
注意.*?
中的问号。您还应该使用s
和i
修饰符,这样您的代码就可以处理如下代码:
lorem ipsum <code>
foo
</code> bar
如果需要验证,可以使用以下方法:
$string = preg_replace("/(<code>).*?(<\/code>)/si", '', $string);
if( (strpos( $string, '<code') !== false) || (strpos( $string, '</code') !== false){
echo 'Invalid code';
}
发布于 2012-03-06 22:01:30
<?php
$string = "aaa<code>asd</code>aaaasd";
if (preg_match("#[a-zA-Z ]+<code>[a-zA-Z ]+<\/code>[a-zA-Z ]+#", $string))
{
echo "It's a match!\n";
} else {
echo "No match, sorry.\n";
}
https://stackoverflow.com/questions/9450484
复制相似问题