替换 PHP 中的字符串
Replacing a string in PHP
我正在开发一个应用程序,它获取文本作为输入并提供序列图作为输出,类似于 Web Sequence Diagrams。因此,对于默认输入,例如 Alice 向 Bob 打招呼,输入是:
Alice -> Bob: Hi
用户可以提供任何类型的输入。上述行的变体:
Alice -> Bob : Hi
Alice -> Bob :Hi
Alice -> Bob: Hi
Alice -> Bob:Hi
Alice ->Bob : Hi
Alice ->Bob :Hi
Alice ->Bob: Hi
Alice ->Bob:Hi
Alice-> Bob : Hi
Alice-> Bob :Hi
Alice-> Bob: Hi
Alice-> Bob:Hi
Alice->Bob : Hi
Alice->Bob :Hi
Alice->Bob: Hi
Alice->Bob:Hi
消息的其他变体包括以下箭头:
-
--
->
-->
->>
-->>
即使我想根据 ->
和 :
拆分输入,也很难,因为这些消息可以按任何顺序出现。所以,如果我给出类似的东西:
Alice --> Bob: Hello
Bob -> Alice: See you!
一开始我限制用户在箭头周围强制给space。之后,计数将为 3,然后使用 :
拆分第三个数组项。这是使用以下代码实现的:
$userInput = array_map('trim', explode("\r\n", trim($input)));
foreach ($userInput as $line) {
$line = array_filter(array_map('trim', explode(" ", str_replace(array(":", ": "), " ", $line), 4)));
我将 :
替换为 space 并将字符串拆分为四个字符,并以 space 作为分隔符。我做的对吗,因为如果给定的 spaces 像上面那样,并且当用户给出所有类型的箭头时,这种方法不起作用。请指导我。
尝试使用正则表达式和 preg_match (http://www.php.net/preg_match)。它会让你的生活更轻松。
正则表达式模式:
/(\w+)\s*\-+>{1,2}\s*(\w+)\s*:\s*(\w+)/i
细分:
(\w+) <- Match and return 1 or more characters
\s* <- Match 0 or more white space characters
(\-+>{1,2}) <- Match and return 1 or more "-" characters followed by 1 or 2 ">" characters
来源:
<?php
foreach ($userInput as $line) {
$matches = array();
preg_match('/(\w+)\s*(\-+>{1,2})\s*(\w+)\s*:\s*(\w+)/i', $line, $matches);
echo $matches[1] . "\n"; // Alive
echo $matches[2] . "\n"; // --> or -> or --->
echo $matches[3] . "\n"; // Bob
echo $matches[4] . "\n"; // Hi
}
我正在开发一个应用程序,它获取文本作为输入并提供序列图作为输出,类似于 Web Sequence Diagrams。因此,对于默认输入,例如 Alice 向 Bob 打招呼,输入是:
Alice -> Bob: Hi
用户可以提供任何类型的输入。上述行的变体:
Alice -> Bob : Hi
Alice -> Bob :Hi
Alice -> Bob: Hi
Alice -> Bob:Hi
Alice ->Bob : Hi
Alice ->Bob :Hi
Alice ->Bob: Hi
Alice ->Bob:Hi
Alice-> Bob : Hi
Alice-> Bob :Hi
Alice-> Bob: Hi
Alice-> Bob:Hi
Alice->Bob : Hi
Alice->Bob :Hi
Alice->Bob: Hi
Alice->Bob:Hi
消息的其他变体包括以下箭头:
-
--
->
-->
->>
-->>
即使我想根据 ->
和 :
拆分输入,也很难,因为这些消息可以按任何顺序出现。所以,如果我给出类似的东西:
Alice --> Bob: Hello
Bob -> Alice: See you!
一开始我限制用户在箭头周围强制给space。之后,计数将为 3,然后使用 :
拆分第三个数组项。这是使用以下代码实现的:
$userInput = array_map('trim', explode("\r\n", trim($input)));
foreach ($userInput as $line) {
$line = array_filter(array_map('trim', explode(" ", str_replace(array(":", ": "), " ", $line), 4)));
我将 :
替换为 space 并将字符串拆分为四个字符,并以 space 作为分隔符。我做的对吗,因为如果给定的 spaces 像上面那样,并且当用户给出所有类型的箭头时,这种方法不起作用。请指导我。
尝试使用正则表达式和 preg_match (http://www.php.net/preg_match)。它会让你的生活更轻松。
正则表达式模式:
/(\w+)\s*\-+>{1,2}\s*(\w+)\s*:\s*(\w+)/i
细分:
(\w+) <- Match and return 1 or more characters
\s* <- Match 0 or more white space characters
(\-+>{1,2}) <- Match and return 1 or more "-" characters followed by 1 or 2 ">" characters
来源:
<?php
foreach ($userInput as $line) {
$matches = array();
preg_match('/(\w+)\s*(\-+>{1,2})\s*(\w+)\s*:\s*(\w+)/i', $line, $matches);
echo $matches[1] . "\n"; // Alive
echo $matches[2] . "\n"; // --> or -> or --->
echo $matches[3] . "\n"; // Bob
echo $matches[4] . "\n"; // Hi
}