【问题标题】:Creating an array of strings from a string从字符串创建字符串数组
【发布时间】:2012-03-15 02:44:50
【问题描述】:

我有一个很长的字符串。在该字符串中,我需要注意和处理某些字符:

$lyrics = "This is an {G}example of a {D}long string.  It's {Em}getting {C}longer and {Am}longer the more I {Dm7-5}type"

我想要做的是找到大括号的出现,如果我在大括号之间找到的字符串的长度小于 X,则执行 A,如果它等于或大于 X,则执行B.

事情 A 和事情 B 都涉及将花括号更改为 HTML。

我已经搜索和思考这个问题很多天了,但我还没有找到一种简洁明了的方法。

当然,我可以将字符串视为一个数组并循环遍历 - 但真的吗?这真的是我从 $lyrics 中的第一个字符开始到最后的问题吗?

我缺少一个明显更简单的解决方案吗?正则表达式会有帮助吗?我知道什么是正则表达式,但我承认我不必经常使用它们。

【问题讨论】:

  • 这可能是熟悉正则表达式的最佳时机。调查一下。
  • 对不起,我想在上面的评论中添加这个:类似:/\{\w*\}/ 可能对你有用。它将匹配大括号之间的单词字符(字母、数字、下划线、非空格)。
  • 是的,在 preg_match 中使用正则表达式。您将以数组的形式获得匹配项。

标签: php


【解决方案1】:

我同意其他人的观点,正则表达式是要走的路。这里有一些可能会有所帮助的示例。

你没有定义你的标签应该做什么,所以让我们使用这个字符串作为例子。我添加的一项是 {sp###}...{/sp} 开始/结束标签,它可以让您更好地控制格式。

$str = "{sp5}{em}Italics {size30}ARE{/sp} {sp18}{b}fun.{/sp}";

关于 PHP 中的模式匹配需要了解的是,通过将部分模式放在括号内,它会将其设置为一个变量,您可以在字符串替换中重复使用该变量。

单字标签

// emphasize the next word
$str = preg_replace("/\{em\}(\w+)\b/","<em>$1</em>",$str);

这里我们寻找一个 {em} 后跟 一个或多个单词字符 \w+ 后跟一个单词边界。单词字符是任何字母、数字或下划线。 \w+ 在括号中,因此它将被设置为变量 $1 并在第二部分中重新使用,将其放置在 HTML em 标记中。括号中的任何其他模式将被迭代命名。 ($1 $2 $3 $4)


// Bold the next word if bracket content is 1 character
$str = preg_replace("/\{\w\}(\w+)\b/","<b>$1</b>",$str);

这里不是专门搜索 {em},而是搜索任何单个 单词字符。仅当它是单个字符时才匹配它,因为 \w 后面没有加号。


// bracket variables 
$str = preg_replace("/\{size(\d+)\}(\w+)\b/","<span style='font-size: $1px;'>$2</span>",$str);

在此示例中,我们将下一个单词的 CSS 字体大小设置为指定的数量。在 {size 之后,我们查找设置为变量 $1 的任何数字中的一个或多个。然后将后面的一系列单词字符设置为$2。

开始/结束标签

// Letter Spacing 
$str = preg_replace("/\{sp(\d+)\}(.+)\{\/sp\}/U","<span style='letter-spacing: $1px;'>$2</span>",$str);

这个和上一个很像,但有 3 个例外。我们不是搜索一个或多个单词字符,而是搜索带有点/句点通配符的任何字符。此外,我们不会以单词边界结束。我们搜索字符串“{/sp}”。最后,我们设置了 internal option U,它代表 Ungreedy。我们必须设置它,因为 ".+" 模式匹配 {/sp};如果模式的其余部分匹配,Ungreedy 允许它匹配第一次出现的结束标记。

终于

我希望这将带您进入正则表达式的美妙世界!

这些应该会有所帮助。

http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

http://www.regextester.com/

【讨论】:

  • 这太棒了。虽然我还不能全部跟随,但我可以跟随你,知道这是正确的轨道。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2016-01-24
相关资源
最近更新 更多