【问题标题】:Replacing a string in PHP替换PHP中的字符串
【发布时间】:2015-01-05 20:58:56
【问题描述】:

我正在开发一个应用程序,该应用程序将文本作为输入并将序列图作为输出,例如 Web Sequence Diagrams。因此,对于默认输入,例如 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:Hi

消息的其他变体包括以下箭头:

  • -
  • --
  • ->
  • -->
  • ->>
  • -->>

即使我想根据->: 拆分输入,也很困难,因为这些消息可以按任何顺序出现。所以,如果我给出类似的东西:

Alice --> Bob: Hello
Bob -> Alice: See you!

起初我限制用户在箭头周围强制留出空间。之后,计数将为 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)));

我将: 替换为空格,并将字符串拆分为最多四个字符,并以空格作为分隔符。我做得对吗,因为如果给定的空格像上面那样,并且当用户给出所有类型的箭头时,这种方法不起作用。请指导我。

【问题讨论】:

标签: php arrays pattern-matching sequence-diagram string-math


【解决方案1】:

尝试使用正则表达式和 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
}

【讨论】:

  • "@Tom 我不想使用正则表达式并使事情复杂化。:) – Praveen Kumar" - 说他不想在 cmets 下使用正则表达式。跨度>
  • @Fred-ii- 他不使用正则表达式的原因是为了防止他的代码复杂化。在这种情况下,我相信使用str_replaceexplode 的文本处理会引起更多的复杂性。这是正则表达式的完美用例。如果他愿意,欢迎他不要选择它作为他的答案,但这仍然是一个有效的选择。
  • @Tom Lemme 检查这个。如果它有效,那很好。没有其他方法可以做到这一点,所以我会用这个!!! :D
  • @Tom,在这种情况下,我还需要箭头的类型。我怎么得到它!哎呀...:(
  • @Fred-ii- 不用担心。什么都行,行得通。 :D
猜你喜欢
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多