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
,那么我们就不希望与之匹配。
答案 0 :(得分:6)
这适用于2个给定的测试用例:
$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
您可以找到有关外观here
的一些有用信息答案 1 :(得分:4)
您可能可以在代码表达式中使用贪婪杀手?
(此处有更多信息:Matching text between delimiters: greedy or lazy regular expression?),所以如果你有这样的代码:
<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';
}
答案 2 :(得分:3)
<?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";
}
答案 3 :(得分:2)
$string = "aaa<code>dlalala lala code</code>aaa";
if (preg_match("#.*<code>.*<\/code>.*#", $string)) {
echo "OK\n";
} else {
echo "NOK\n";
}
答案 4 :(得分:2)
试试这些
$string = "lalala text <code>dlalala lala code</code> lalalal";
if(strlen($string)>0){
preg_match("/\<code\>(.*)\<\/code\>/",$string, $code);
echo $code[1];
}else{
echo "no code found";
}
输出将是:
祝你好运:)dlalala lala code
答案 5 :(得分:2)
<?php
$sample_text = <<<EOF
blah blah
<code>one</code>
foo<code>two</code>three</code>
<code><code>four</code>bar
</code><code>five</code>foobar
<code>six</code>
blah blah blah
EOF;
preg_match_all('/<code>(?\'code\'((?!<\/?code>).)*)<\/code>/', $sample_text, $codes);
print_r($codes);
?>
答案 6 :(得分:0)
你最好使用strpos进行简单的字符串比较,这意味着你不必担心转义特殊字符,而且速度更快。
这将有效
已获编辑以获取标记。
$string = "This string has 'Anything <code> anything </code> anything' in it in the right order.";
$start = strpos($string, '<code>');
$end = strpos($string, '</code>');
if ($start !== FALSE && $end !== FALSE && $end > $start){
echo $string;
}else{
echo 'incorrectly formatted';
}
如果您想使用PREG_MATCH
if(preg_match("/.*(<code>).*(<\/code>).*/", $string)){
echo $string
}
注意 - 您不希望使用HTML实体,除非您确定使用HTML实体格式化字符串。你不需要外面的圆括号。