首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Preg_match,如果<code></code>格式正确

Preg_match,如果<code></code>格式正确
EN

Stack Overflow用户
提问于 2012-02-26 04:13:27
回答 7查看 2.4K关注 0票数 2
代码语言:javascript
运行
复制
if(preg_match("/(.*(&lt;code&gt;).*(&lt;\/code&gt;).*)*/", $string))

我已经试了好几个小时了,但我做不到。如果用户格式化的文本格式正确,如:

代码语言:javascript
运行
复制
(any_string*<code>any_string*</code>any_string*)*

只有这样,我才会将文本格式化为*,意思是空字符串,或者很多次。我的表情怎么了?

编辑:,我想匹配lalala text <code>dlalala lala code</code> lalalal。如果它是lala <code> lalalalalal </code> <code> lalala <code>alala,那么我们就不想匹配它。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-03-08 13:09:05

这适用于两个给定的测试用例:

代码语言:javascript
运行
复制
$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";
    }
}

输出:

代码语言:javascript
运行
复制
lalala text <code>dlalala lala code</code> lalalal.
===> Match
lala <code> lalala or lalal </code> <code> lalala <code>alala
===> Not match

关于正则表达式的一些解释:

代码语言:javascript
运行
复制
#           : 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

你可以找到一些有用的关于查找这里的信息。

票数 6
EN

Stack Overflow用户

发布于 2012-03-03 23:28:03

您可能会在代码表达式中使用贪婪杀手? (这里有更多信息:分隔符之间的匹配文本:贪婪还是懒惰的正则表达式? ),所以如果您有这样的代码:

代码语言:javascript
运行
复制
<code>foo</code> another <code>bar</code> 

它将只匹配foobar而不是foo</code> another <code>bar,还应该使用preg_match_all() (带有标志PREG_OFFSET_CAPTURE)并编写自己的解析器。或者像这样使用preg_replace_callback()

代码语言:javascript
运行
复制
// Just strtolower example (this would do formatting)
function myCallback( $matches){
    return strlower( $matches[2]);
}

$string = preg_replace_callback("/(&lt;code&gt;).*?(&lt;\/code&gt;)/si", 'myCallback', $string)

注意.*?中的问号。您还应该使用si修饰符,这样您的代码就可以处理如下代码:

代码语言:javascript
运行
复制
lorem ipsum <code>
foo
</code> bar

如果需要验证,可以使用以下方法:

代码语言:javascript
运行
复制
$string = preg_replace("/(&lt;code&gt;).*?(&lt;\/code&gt;)/si", '', $string);
if( (strpos( $string, '<code') !== false) || (strpos( $string, '</code') !== false){
    echo 'Invalid code';
}
票数 4
EN

Stack Overflow用户

发布于 2012-03-06 22:01:30

代码语言:javascript
运行
复制
<?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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9450484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档