我有一个很长的字符串。在该字符串中,我需要注意和处理某些字符:
$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"
我想要做的是找到花括号的出现次数,如果我在花括号之间找到的字符串的LENGTH小于X,那么做A,如果它等于或大于X,事情B.
A和B都涉及将花括号更改为HTML。
我多年来一直在寻找和思考这个问题,而且我还没有找到一种简洁明了的方法。
当然我可以将字符串视为一个数组并循环遍历 - 但是真的吗?这真的是我从$ lyrics中的第一个角色开始并一直走到最后?
我缺少一个明显更简单的解决方案吗?正则表达式有帮助吗?我知道正则表达式是什么,但我承认我没有必要与他们合作过多。
答案 0 :(得分: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}”。最后,我们设置内部选项 U,代表Ungreedy。我们必须设置它,因为“。+”模式匹配{/ sp};如果模式的其余部分匹配,Ungreedy允许它匹配结束标记的第一次出现。
我希望这会让你在正常表达的精彩世界中前进!
这些应该有所帮助。
http://www.php.net/manual/en/reference.pcre.pattern.syntax.php