当前位置: 首页 > 知识库问答 >
问题:

preg_replace只替换两个符号之间的字符串,如果它包含特定的内容

熊俊人
2023-03-14

我尝试只替换两个符号之间的字符串,并在字符串包含特定单词时开始替换,例如:

$string = '%Test% %font-style:italic; font-weight:bold;%'; //It Can be with different orders such as
$string = '%Test% %font-weight:bold; font-style:italic;%'; 

因此,我想要使用preg_replace的字符串是这两个符号之间的字符串%%,我想要使用preg_replace,只要字符串包含一个css标记,例如字体样式:italic;颜色:红色;字体大小:粗体;等等


$string = preg_replace('`\%(.*?)((.*?):(.*?);)(.*?)\%`si', '(span style="$2$5")', $string); // ( used as start tag html symbol

但是当我使用它的时候,它引起了一个问题

http://localhost/NaiTreNo/Games/Games/BatMan%20Arkham%20Knight/Image/Cover.jpg :D %color:blue; font-weight:bold;%

它应该返回:

http://localhost/NaiTreNo/Games/Games/BatMan%20Arkham%20Knight/Image/Cover.jpg :D
<span style="color:blue; font-weight:bold;">

但它返回:

http://localhost/NaiTreNo/Games/Games/BatMan<span style="20Arkham%20Knight/Image/Cover.jpg :D %color:blue; font-weight:bold;%">

请帮忙。


共有2个答案

阎星华
2023-03-14

我可以建议在开头加一个空格。

$string = preg_replace('`(^| )\%(.*?)((.*?):(.*?);)(.*?)\%`si', ' <span style="$2$5">', $string); // ( used as start tag html symbol

试试https://3v4l.org/uubF7

孙钱青
2023-03-14
匿名用户

你的regex太松了。它只检查字符串中某处是否存在。我将使用CSS属性名称具有特定格式的知识来创建一个regex规则,该规则不匹配包含的任何字符串。

例如,类似这样的内容:

#%(([a-z]+(-[a-z]+){0,2}: *[^;]+;)+)(.*?)%#si

CSS属性名以包含一个或多个小写字母[a-z]的单词开头,后面是零,一个或两个以上的单词,每个单词前面都有破折号(-[a-z]){0,2}

限制太接受的规则。*?也可以创建用于值的,但结果不会付出代价(并且正则表达式变得难以理解。

regex的工作原理:

%                      # your custom boundary start symbol
  (                    # start of group #1 used to capture the CSS rules
    (                  # start of group #2 that captures a single CSS rul
      [a-z]+           # first word of CSS property name
      (-[a-z]+){0,2}   # 0-2 more words, separated with dash (-)
      : *              # the colon followed by optional white spaces
      [^;]+;           # anything until the first semicolon (at least one character)
    )+                 # end of group #2; it can repeat; at least one occurence is required
  )                    # end of group #1
  (.*?)                # captures everything after the last semicolon
%                      # your custom boundary end symbol

当只有一个CSS属性且其值后面没有分号时,上面的regex不匹配,例如%color:red%。为了解决此问题,必须将组2后面的符号替换为*(以匹配零个或多个以结尾的CSS规则),但这样结尾的(*)将匹配任何内容,包括Test或示例中的URL。

可以通过替换* 在最后一组中,内容为第2组,无结尾 。这个表达变得越来越长,越来越难理解,我不会在这里发布。您最好确保CSS规则始终以分号()结尾,包括最后一个分号。

regex的游乐场位于:https://regex101.com/r/vC1oS2/3

 类似资料:
  • 我怎么能在Java中做到这一点呢?

  • 问题内容: 我想删除两个字符之间以及字符本身之间的字符串,例如说: 我想替换“#?”之间所有出现的字符串 和“;” 并用字符将其删除。 由此 对此 我怎么能用Java做到呢? 问题答案: 使用正则表达式:

  • 问题内容: 假设我们有类似的东西: 我想将“ someText”替换为其他内容。考虑到我不知道someText可能是什么(任何字符串)并且我所知道的是它将被&firstString =和&endString =包围的事实,最佳方法是什么? 编辑:对不起,看起来这还不够清楚。我不知道“ someText”可能是什么,我仅有的信息是它将位于&firstString =和&endString =之间 我

  • 问题内容: 我正在寻找一种快速简便的单行代码,以从文本文件中提取所有包含搜索字符串的大括号分隔的文本块。我只是为此而在Google上发疯,但是每个人似乎都只是在发布有关在没有搜索字符串的情况下在大括号之间获取文本的信息。 我有一个大型文本文件,其内容如下: 方括号中的绝大多数条目都不包含搜索字符串,即“事件”。 我要提取的是每组花括号之间的所有文本(尤其是多行匹配),但前提是所述文本还包含搜索字符

  • 问题内容: 我想替换包含特定子字符串的所有字符串。因此,例如,如果我有此数据框: 我可以用字符串“ ball sport”代替足球,如下所示: 我想,虽然是替换包含所有(在这种情况下和)与“球运动”。像这样: 问题答案: 您可以用来掩盖包含“ ball”的行,然后用新值覆盖: 要使其不区分大小写,请通过`case = False:

  • 我只想在文本中的两个特定字符之间替换字符的每次出现。