Mặc dù tôi có đủ kiến thức về regex trong mã giả, tôi gặp khó khăn trong việc dịch những gì tôi muốn làm trong php regex perl.
Tôi đang cố gắng sử dụng preg_match để trích xuất một phần biểu thức của mình.
Tôi có chuỗi sau ${classA.methodA.methodB(classB.methodC(classB.methodD)))}
và tôi cần phải làm 2 việc:
PHP Regex preg_match extract
a. xác nhận các cú pháp
${classA.methodA.methodB(classB.methodC(classB.methodD)))}
hợp lệ${classA.methodA.methodB}
hợp lệ${classA.methodA.methodB()}
không hợp lệ${methodB(methodC(classB.methodD)))}
không hợp lệ
b. Tôi cần phải trích lục các thông tin ${classA.methodA.methodB(classB.methodC(classB.methodD)))}
nên trở
1. classA
2. methodA
3. methodB (classB.methodC (classB.methodD)))
Tôi đã tạo mã này
$expression = '${myvalue.fdsfs.fsdf.blo(fsdf.fsfds(fsfs.fs))}';
$pattern = '/\$\{(?:([a-zA-Z0-9]+)\.)(?:([a-zA-Z\d]+)\.)*([a-zA-Z\d.()]+)\}/';
if(preg_match($pattern, $expression, $matches))
{
echo 'found'.'<br/>';
for($i = 0; $i < count($matches); $i++)
echo $i." ".$matches[$i].'<br/>';
}
kết quả là:
tìm thấy
0 $ {myvalue.fdsfs.fsdf.blo (fsdf.fsfds (fsfs.fs))}
1 myValue
2 fsdf
3 Blo (fsdf.fsfds (fsfs.fs))
Rõ ràng Tôi đang gặp khó khăn để trích xuất các phương pháp lặp lại và nó không xác nhận nó đúng cách (trung thực tôi đã để lại nó lần cuối cùng khi tôi giải quyết vấn đề khác) vì vậy dấu ngoặc đơn trống được cho phép và không kiểm tra xem nó có mở ngoặc không phải được đóng lại.
Cảm ơn tất cả
CẬP NHẬT
X m.buettner
Nhờ sự giúp đỡ của bạn. Tôi đã thử một cách nhanh chóng để mã của bạn nhưng nó cho một vấn đề rất nhỏ, mặc dù tôi có thể bằng cách vượt qua nó. Vấn đề là như nhau của một trong những mã trước của tôi rằng tôi đã không gửi ở đây là khi tôi cố gắng chuỗi này:
$expression = '${myvalue.fdsfs}';
với nét hoa văn của bạn nó cho thấy:
found
0 ${myvalue.fdsfs}
1 myvalue.fdsfs
2 myvalue
3
4 fdsfs
Như bạn có thể xem dòng thứ ba được đánh bắt như một khoảng trắng không có mặt. Tôi không thể hiểu tại sao nó đã làm điều đó vì vậy bạn có thể đề nghị tôi làm thế nào để hoặc tôi phải sống với nó do hạn chế regex php?
Điều đó nói rằng tôi chỉ có thể cho bạn biết cảm ơn bạn. Không chỉ bạn trả lời cho vấn đề của tôi mà còn là bạn đã cố gắng nhập càng nhiều thông tin càng tốt với nhiều gợi ý về con đường thích hợp để làm theo khi phát triển các mẫu.
Một điều cuối cùng tôi (ngu ngốc) quên thêm một ít trường hợp quan trọng đó là nhiều tham số chia bằng dấu phẩy để
$expression = '${classA.methodAA(classB.methodBA(classC.methodCA),classC.methodCB)}';
$expression = '${classA.methodAA(classB.methodBA(classC.methodCA),classC.methodCB,classD.mehtodDA)}';
phải hợp lệ.
tôi chỉnh sửa để
$expressionPattern =
'/
^ # beginning of the string
[$][{] # literal ${
( # group 1, used for recursion
( # group 2 (class name)
[a-z\d]+ # one or more alphanumeric characters
) # end of group 2 (class name)
[.] # literal .
( # group 3 (all intermediate method names)
(?: # non-capturing group that matches a single method name
[a-z\d]+ # one or more alphanumeric characters
[.] # literal .
)* # end of method name, repeat 0 or more times
) # end of group 3 (intermediate method names);
( # group 4 (final method name and arguments)
[a-z\d]+ # one or or more alphanumeric characters
(?: # non-capturing group for arguments
[(] # literal (
(?1) # recursively apply the pattern inside group 1
(?: # non-capturing group for multiple arguments
[,] # literal ,
(?1) # recursively apply the pattern inside group 1 on parameters
)* # end of multiple arguments group; repeat 0 or more times
[)] # literal)
)? # end of argument-group; make optional
) # end of group 4 (method name and arguments)
) # end of group 1 (recursion group)
[}] # literal }
$ # end of the string
/ix';
X Casimir et Hippolyte
gợi ý của bạn này cũng tốt nhưng nó ngụ ý một chút tình hình phức tạp khi sử dụng mã này. Tôi có nghĩa là mã chính nó là dễ hiểu nhưng nó nhận được ít linh hoạt. Điều đó nói rằng nó cũng đã cho tôi rất nhiều thông tin chắc chắn có thể hữu ích trong tương lai.
X Denomales
Cám ơn sự ủng hộ của bạn, nhưng mã của bạn rơi khi tôi cố gắng này:
$sourcestring='${classA1.methodA0.methodA1.methodB1(classB.methodC(classB.methodD))}';
kết quả là:
Array
( [0] => Mảng ( [0] => $ {classA1.methodA0.methodA1.methodB1 (classB.methodC (cl assB.methodD))} )
[1] => Array
(
[0] => classA1
)
[2] => Array
(
[0] => methodA0
)
[3] => Array
(
[0] => methodA1.methodB1(classB.methodC(classB.methodD))
)
)
Nó phải là
[2] => Array
(
[0] => methodA0.methodA1
)
[3] => Array
(
[0] => methodB1(classB.methodC(classB.methodD))
)
)
hoặc
[2] => Array
(
[0] => methodA0
)
[3] => Array
(
[0] => methodA1
)
[4] => Array
(
[0] => methodB1(classB.methodC(classB.methodD))
)
)
Khi tôi thử $ expression = '$ {myvalue.fdsfs}'; – user2463968
@ user2463968 Vậy thì sao? Bạn nhận được một tên lớp, không có phương thức trung gian và phương thức cuối cùng mà không có đối số. Đó không phải là ý định của bạn? –