我需要从字符串的开头删除多个字符串,例如www
,ww2
,www3
。
例如,如果字符串为www3testme
,那么我需要移除www3
并仅获取testme
。
以下是我使用的代码,但它不能以某种方式工作。
$str = "www3testabc";
$str = mb_ereg_replace("^(www|www3|ww2)", "", $str);
echo $str;
它给出了" 3testabc"而不是" testabc"。
不确定我做错了什么。
我只想使用mb_ereg_replace()
功能。
答案 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输入。
请注意,如果您无法控制/u
,www
等字符串,并且您动态构建模式,则需要按字母顺序按降序对字符串进行排序,然后{{ 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;