如何使用正则表达式

时间:2017-05-02 14:30:42

标签: php regex pattern-matching

我需要从字符串的开头删除多个字符串,例如wwwww2www3

例如,如果字符串为www3testme,那么我需要移除www3并仅获取testme

以下是我使用的代码,但它不能以某种方式工作。

$str = "www3testabc";
$str = mb_ereg_replace("^(www|www3|ww2)", "", $str);
echo $str;

它给出了" 3testabc"而不是" testabc"。

不确定我做错了什么。

我只想使用mb_ereg_replace()功能。

3 个答案:

答案 0 :(得分:0)

test "publish_message appends message to room" do with_mocks([ {ShortTermMessageStore, [], [publish: fn(_, _, _) -> true end]}, {Repo, [], [is_authorized_to_join: fn(_, _) -> true end, is_authorized_to_publish_message_to_room: fn(_, _) -> true end, append_message_to_store: fn(_, _, _) -> true end]}, ]) do {:ok, _room} = open_room "c78940ab-2514-493e-81fe-64efc63c7bb0" sock = open_socket() |> subscribe_and_join!(RoomChannel, "room: c78940ab-2514-493e-81fe-64efc63c7bb0") push sock, "publish_message", %{"id" => "123", "room_id" => "c78940ab-2514-493e-81fe-64efc63c7bb0"} assert_broadcast "publish_message", %{"id" => "123", "room_id" => "c78940ab-2514-493e-81fe-64efc63c7bb0", "sequence" => 1} {:ok, mailbox} = Rooms.mailbox("c78940ab-2514-493e-81fe-64efc63c7bb0") assert [%{"id" => "123", "room_id" => "c78940ab-2514-493e-81fe-64efc63c7bb0", "sequence" => 1}] = mailbox end end 模式包含未锚定的交替组。由于(www|www3|ww2),第一个分支与www中的www匹配,www3testabc甚至未经过测试,正则表达式抓取www3并将其删除。因此,这个数字仍然存在。

请参阅Remember That The Regex Engine Is Eager

您需要从最长到最短(例如www)对备选方案进行排序,或者,在您的情况下,将字符串开头的^(www3|www2|www)与0+匹配会更方便数字并使用

www

请参阅PHP demo

注意您也可以使用$str = "www3testabc"; $str = mb_ereg_replace("^www[0-9]*", "", $str); echo $str;

preg_replace

$str = preg_replace("/^www[0-9]*/u", "", $str); 正则表达式将删除/^www[0-9]*/u,然后删除任何0+位数,并且会因www UNICODE修饰符而正确处理Unicode输入。

请注意,如果您无法控制/uwww等字符串,并且您动态构建模式,则需要按字母顺序按降序对字符串进行排序,然后{{ 1}}。

答案 1 :(得分:0)

www3testabca首先匹配www。将订单更改为

$str = mb_ereg_replace("^(www3|www|ww2)", "", $str);

诀窍。

答案 2 :(得分:0)

它不起作用,因为www3testabc满足www3& www,但www字符串在前面提到过。在括号内交换字符串,因此较长的字符串将是第一个&它应该工作。

$str = "www3testabc";
$str = mb_ereg_replace("^(www3|ww2|www)", "", $str);
echo $str;