PDA

View Full Version : regex برای تابع preg_split



engmmrj
شنبه 31 خرداد 1393, 17:36 عصر
سلام
من به احتیاج به یک Regex داشم که تگ های html رو بصورت آرایه در بیاره ، وقتی به یک label رسید از سر label تا انتها سر label بعدی بریزه تو آرایه
کد من :

$html = preg_split('/*/', $row['html']);
echo '<pre>'. print_r($html, true);

نمونه html

<label>name</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="name" size="12" type="text"><br>
<label>lname</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="lname" size="10" type="text"><br>
<label>جنسیت</label><select name="form[]" data-show="false" data-name="gender"><option value="2" data-parent="age">مرد</option><option value="1" data-parent="age">زن</option></select><br>
<label>توضیحات</label><textarea name="form[]" data-show="false" data-parent="child" data-required="true" data-name="description"></textarea><br>
<label>تصویر شما</label><input name="form[]" data-show="false" data-parent="child" data-required="false" data-type="jpg" data-size="1" data-name="image" type="file"><br>
<label>name</label><input name="form[]" data-show="true" data-parent="child" data-required="true" data-name="age" size="12" type="text"><br>
<label>test 1</label><input value="as" data-parent="child" data-name="test" type="radio">
<label>test 2</label><input value="acas" data-parent="child" data-name="test2" type="checkbox">
میخوام هر خونه آرایه بصورت زیر در بیاد

<label>name</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="name" size="12" type="text"><br>

engmmrj
شنبه 31 خرداد 1393, 18:41 عصر
:افسرده: .

id1385
شنبه 31 خرداد 1393, 18:43 عصر
<?php
$html = '<label>name</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="name" size="12" type="text">
<label>lname</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="lname" size="10" type="text">
<label>جنسيت</label><select name="form[]" data-show="false" data-name="gender"><option value="2" data-parent="age">مرد</option><option value="1" data-parent="age">زن</option></select>
<label>توضيحات</label><textarea name="form[]" data-show="false" data-parent="child" data-required="true" data-name="description"></textarea>
<label>تصوير شما</label><input name="form[]" data-show="false" data-parent="child" data-required="false" data-type="jpg" data-size="1" data-name="image" type="file">
<label>name</label><input name="form[]" data-show="true" data-parent="child" data-required="true" data-name="age" size="12" type="text">
<label>test 1</label><input value="as" data-parent="child" data-name="test" type="radio">
<label>test 2</label><input value="acas" data-parent="child" data-name="test2" type="checkbox">';


$patern = '#<(label|LABEL).*?">#';
preg_match_all($patern, $html, $matches);
var_dump($matches);

engmmrj
شنبه 31 خرداد 1393, 18:50 عصر
<?php
$html = '<label>name</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="name" size="12" type="text">
<label>lname</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="lname" size="10" type="text">
<label>جنسيت</label><select name="form[]" data-show="false" data-name="gender"><option value="2" data-parent="age">مرد</option><option value="1" data-parent="age">زن</option></select>
<label>توضيحات</label><textarea name="form[]" data-show="false" data-parent="child" data-required="true" data-name="description"></textarea>
<label>تصوير شما</label><input name="form[]" data-show="false" data-parent="child" data-required="false" data-type="jpg" data-size="1" data-name="image" type="file">
<label>name</label><input name="form[]" data-show="true" data-parent="child" data-required="true" data-name="age" size="12" type="text">
<label>test 1</label><input value="as" data-parent="child" data-name="test" type="radio">
<label>test 2</label><input value="acas" data-parent="child" data-name="test2" type="checkbox">';


$patern = '#<(label|LABEL).*?">#';
preg_match_all($patern, $html, $matches);
var_dump($matches);


خیلی ممنون

engmmrj
یک شنبه 01 تیر 1393, 13:24 عصر
به چه regex میتونم data-name هر آرایه رو بدست بیارم ؟

engmmrj
یک شنبه 01 تیر 1393, 13:44 عصر
<?php
$html = '<label>name</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="name" size="12" type="text">
<label>lname</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="lname" size="10" type="text">
<label>جنسيت</label><select name="form[]" data-show="false" data-name="gender"><option value="2" data-parent="age">مرد</option><option value="1" data-parent="age">زن</option></select>
<label>توضيحات</label><textarea name="form[]" data-show="false" data-parent="child" data-required="true" data-name="description"></textarea>
<label>تصوير شما</label><input name="form[]" data-show="false" data-parent="child" data-required="false" data-type="jpg" data-size="1" data-name="image" type="file">
<label>name</label><input name="form[]" data-show="true" data-parent="child" data-required="true" data-name="age" size="12" type="text">
<label>test 1</label><input value="as" data-parent="child" data-name="test" type="radio">
<label>test 2</label><input value="acas" data-parent="child" data-name="test2" type="checkbox">';


$patern = '#<(label|LABEL).*?">#';
preg_match_all($patern, $html, $matches);
var_dump($matches);


این کد تگ های option را پاک میکنه و تگ بستن teatarea پاک می کنه
تگ های select رو خراب میکنه

<label>sd</label><select name="form[]" data-show="false" data-name="df"><option value="df" data-parent="df">df</option><option value="fdf" data-parent="df">d</option></select><br>

تبدیل کرده به

<select name="form[]" data-show="false" data-name="df"><br>

***BiDaK***
یک شنبه 01 تیر 1393, 14:38 عصر
$html = '<label>name</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="name" size="12" type="text">
<label>lname</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="lname" size="10" type="text">
<label>جنسیت</label><select name="form[]" data-show="false" data-name="gender"><option value="2" data-parent="age">مرد</option><option value="1" data-parent="age">زن</option></select>
<label>توضیحات</label><textarea name="form[]" data-show="false" data-parent="child" data-required="true" data-name="description"></textarea>
<label>تصویر شما</label><input name="form[]" data-show="false" data-parent="child" data-required="false" data-type="jpg" data-size="1" data-name="image" type="file">
<label>name</label><input name="form[]" data-show="true" data-parent="child" data-required="true" data-name="age" size="12" type="text">
<label>test 1</label><input value="as" data-parent="child" data-name="test" type="radio">
<label>test 2</label><input value="acas" data-parent="child" data-name="test2" type="checkbox">';


preg_match_all('/<label>.+/', $html, $match);
echo '<pre>'. print_r($match, true);

shpegah
یک شنبه 01 تیر 1393, 20:50 عصر
اگر تمایل دارید نامهای لیبل وdata-nameهم در آرایه ذخیره شود به این روش کار کنید



preg_match_all('/<label>(.*)<\/label>.* data-name="(.[^"]+)".*/', $html, $match);
var_dump($matches);

engmmrj
جمعه 06 تیر 1393, 17:02 عصر
$html = '<label>name</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="name" size="12" type="text">
<label>lname</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="lname" size="10" type="text">
<label>جنسیت</label><select name="form[]" data-show="false" data-name="gender"><option value="2" data-parent="age">مرد</option><option value="1" data-parent="age">زن</option></select>
<label>توضیحات</label><textarea name="form[]" data-show="false" data-parent="child" data-required="true" data-name="description"></textarea>
<label>تصویر شما</label><input name="form[]" data-show="false" data-parent="child" data-required="false" data-type="jpg" data-size="1" data-name="image" type="file">
<label>name</label><input name="form[]" data-show="true" data-parent="child" data-required="true" data-name="age" size="12" type="text">
<label>test 1</label><input value="as" data-parent="child" data-name="test" type="radio">
<label>test 2</label><input value="acas" data-parent="child" data-name="test2" type="checkbox">';


preg_match_all('/<label>.+/', $html, $match);
echo '<pre>'. print_r($match, true);



این یک مشکلی داره ، این regex برای تگ هایی کار میکنه که اینوری بسته بشن </tag> برای تگ هایی مثل input جواب نمیده

pre>Array
(
[0] => Array
(
[0] => <label>a</label><select data-required="true" name="form[]" data-show="false" data-name="a"><option value="" data-parent="child"></option><option value="1" data-parent="b">b</option></select><br>
[1] => <label>b</label><select name="form[]" data-show="true" data-name="b"><option value="" data-parent="child"></option><option value="c" data-parent="c">c</option></select><br>
[2] => <label>c</label><select name="form[]" data-show="true" data-name="c"><option value="" data-parent="child"></option><option value="d" data-parent="d">d</option></select><br>
[3] => <label>d</label><select data-required="true" name="form[]" data-show="true" data-name="d"><option value="" data-parent="child"></option><option value="w" data-parent="w">w</option></select><br>
[4] => <label>w</label><input name="form[]" data-show="true" data-parent="j" data-name="w" value="2" type="checkbox"><label>توضیحات</label><textarea name="form[]" data-show="true" data-required="true" data-name="j"></textarea><br>
)

)
</pre>
خونه 4 آریه رو نگاه کنید ، تگ input رو با textarea یکی گرفته

engmmrj
شنبه 07 تیر 1393, 11:11 صبح
regex درست کار نمیکنه!

***BiDaK***
شنبه 07 تیر 1393, 12:14 عصر
اگه هرکدوم تویک لاین باشن طبق همون کدی که اول گذاشته بودی جواب درست میده.
ولی یه regex دیگه هم نوشتم که آخر کد یک تگ <br> اضافه کردم تا لاین آخرو هم تو نتایج بیاره.
شرطی خواستم بنویسم عمل نکرد:متفکر:



$html = '<label>name</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="name" size="12" type="text"><label>lname</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="lname" size="10" type="text"><label>جنسیت</label><select name="form[]" data-show="false" data-name="gender"><option value="2" data-parent="age">مرد</option><option value="1" data-parent="age">زن</option></select><label>توضیحات</label><textarea name="form[]" data-show="false" data-parent="child" data-required="true" data-name="description"></textarea><label>تصویر شما</label><input name="form[]" data-show="false" data-parent="child" data-required="false" data-type="jpg" data-size="1" data-name="image" type="file"><label>name</label><input name="form[]" data-show="true" data-parent="child" data-required="true" data-name="age" size="12" type="text"><label>test 1</label><input value="as" data-parent="child" data-name="test" type="radio"><label>test 2</label><input value="acas" data-parent="child" data-name="test2" type="checkbox"> <br>';

preg_match_all('/(?ms)<label>.+?(?=<label>|\<br\>)/i', $html, $match);
echo '<pre>'. print_r($match, true);

engmmrj
شنبه 07 تیر 1393, 12:19 عصر
اگه هرکدوم تویک لاین باشن طبق همون کدی که اول گذاشته بودی جواب درست میده.
ولی یه regex دیگه هم نوشتم که آخر کد یک تگ <br> اضافه کردم تا لاین آخرو هم تو نتایج بیاره.
شرطی خواستم بنویسم عمل نکرد:متفکر:
با این html کار نمیکنه :


$html = '<label>name</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="name" size="12" type="text"><label>lname</label><input name="form[]" data-show="false" data-parent="child" data-required="true" data-name="lname" size="10" type="text"><label>جنسیت</label><select name="form[]" data-show="false" data-name="gender"><option value="2" data-parent="age">مرد</option><option value="1" data-parent="age">زن</option></select><label>توضیحات</label><textarea name="form[]" data-show="false" data-parent="child" data-required="true" data-name="description"></textarea><label>تصویر شما</label><input name="form[]" data-show="false" data-parent="child" data-required="false" data-type="jpg" data-size="1" data-name="image" type="file"><label>name</label><input name="form[]" data-show="true" data-parent="child" data-required="true" data-name="age" size="12" type="text"><label>test 1</label><input value="as" data-parent="child" data-name="test" type="radio"><label>test 2</label><input value="acas" data-parent="child" data-name="test2" type="checkbox"> <br>'; preg_match_all('/(?ms)<label>.+?(?=<label>|<br>)/i', $html, $match);echo '<pre>'. print_r($match, true);

<label>a</label><select data-required="true" name="form[]" data-show="false" data-name="a"><option value="" data-parent="child"></option><option value="1" data-parent="b">b</option></select><br>
<label>b</label><select name="form[]" data-show="true" data-name="b"><option value="" data-parent="child"></option><option value="c" data-parent="c">c</option></select><br>
<label>c</label><select name="form[]" data-show="true" data-name="c"><option value="" data-parent="child"></option><option value="d" data-parent="d">d</option></select><br>
<label>d</label><select data-required="true" name="form[]" data-show="true" data-name="d"><option value="" data-parent="child"></option><option value="w" data-parent="w">w</option></select><br>
<label>w</label><input name="form[]" data-show="true" data-parent="j" data-name="w" value="2" type="checkbox"><label>توضیحات</label><textarea name="form[]" data-show="true" data-required="true" data-name="j"></textarea><br>

این regex که دادین با این html کار نمیکنه ، این جدید هم که دادید کلا کار نمیکنه

<pre>Array
(
[0] => Array
(
[0] => <label>a
[1] => <label>b
[2] => <label>c
[3] => <label>d
[4] => <label>w
[5] => <label>�
)

)
</pre>

***BiDaK***
شنبه 07 تیر 1393, 12:24 عصر
ادیتور br خورده بود.اسکیپش کردم دوباره تست کن.

preg_match_all('/(?ms)<label>.+?(?=<label>|\<br\>)/i', $html, $match);





<pre>Array( [0] => Array ( [0] => <label>a</label><select data-required="true" name="form[]" data-show="false" data-name="a"><option value="" data-parent="child"></option><option value="1" data-parent="b">b</option></select> [1] => <label>b</label><select name="form[]" data-show="true" data-name="b"><option value="" data-parent="child"></option><option value="c" data-parent="c">c</option></select> [2] => <label>c</label><select name="form[]" data-show="true" data-name="c"><option value="" data-parent="child"></option><option value="d" data-parent="d">d</option></select> [3] => <label>d</label><select data-required="true" name="form[]" data-show="true" data-name="d"><option value="" data-parent="child"></option><option value="w" data-parent="w">w</option></select> [4] => <label>w</label><input name="form[]" data-show="true" data-parent="j" data-name="w" value="2" type="checkbox"> [5] => <label>توضیحات</label><textarea name="form[]" data-show="true" data-required="true" data-name="j"></textarea> )
)

shpegah
شنبه 07 تیر 1393, 12:25 عصر
منظورتونو نفهمیدم لطفا استرینگتونو (html$) رو بذارید تا مشخص تر بشه
کدregx کذاشته شده هر خطی که با <label> شروع شده را در یک خانه آرایه قرار میده مشکلش چیه ؟ اگر <label> وسط جمله باشه آن را طبیعی است در آرایه نگذارد

engmmrj
شنبه 07 تیر 1393, 12:28 عصر
ادیتور br خورده بود.اسکیپش کردم دوباره تست کن.

preg_match_all('/(?ms)<label>.+?(?=<label>|\<br\>)/i', $html, $match);





[0] => <label>a</label><select data-required="true" name="form[]" data-show="false" data-name="a"><option value="" data-parent="child"></option><option value="1" data-parent="b">b</option></select> [1] => <label>b</label><select name="form[]" data-show="true" data-name="b"><option value="" data-parent="child"></option><option value="c" data-parent="c">c</option></select> [2] => <label>c</label><select name="form[]" data-show="true" data-name="c"><option value="" data-parent="child"></option><option value="d" data-parent="d">d</option></select> [3] => <label>d</label><select data-required="true" name="form[]" data-show="true" data-name="d"><option value="" data-parent="child"></option><option value="w" data-parent="w">w</option></select> [4] => <label>w</label><input name="form[]" data-show="true" data-parent="j" data-name="w" value="2" type="checkbox"> [5] => <label>توضیحات</label><textarea name="form[]" data-show="true" data-required="true" data-name="j"></textarea>

کار کرد ، دستت درد نکنه .

engmmrj
شنبه 07 تیر 1393, 12:31 عصر
منظورتونو نفهمیدم لطفا استرینگتونو (html$) رو بذارید تا مشخص تر بشه
کدregx کذاشته شده هر خطی که با <label> شروع شده را در یک خانه آرایه قرار میده مشکلش چیه ؟ اگر <label> وسط جمله باشه آن را طبیعی است در آرایه نگذارد
میخواستم این Html را از اول label تا اول label بعدی تو آریه بریزم .

<label>a</label><select data-required="true" name="form[]" data-show="false" data-name="a"><option value="" data-parent="child"></option><option value="1" data-parent="b">b</option></select><br>
<label>b</label><select name="form[]" data-show="true" data-name="b"><option value="" data-parent="child"></option><option value="c" data-parent="c">c</option></select><br>
<label>c</label><select name="form[]" data-show="true" data-name="c"><option value="" data-parent="child"></option><option value="d" data-parent="d">d</option></select><br>
<label>d</label><select data-required="true" name="form[]" data-show="true" data-name="d"><option value="" data-parent="child"></option><option value="w" data-parent="w">w</option></select><br>
<label>w</label><input name="form[]" data-show="true" data-parent="j" data-name="w" value="2" type="checkbox"><label>توضیحات</label><textarea name="form[]" data-show="true" data-required="true" data-name="j"></textarea><br>

با regex که ***bidak*** دادن آرایه بصورت زیر در اومد که الان درست کار میکنه

[0] => <label>a</label><select data-required="true" name="form[]" data-show="false" data-name="a"><option value="" data-parent="child"></option><option value="1" data-parent="b">b</option></select>
[1] => <label>b</label><select name="form[]" data-show="true" data-name="b"><option value="" data-parent="child"></option><option value="c" data-parent="c">c</option></select>
[2] => <label>c</label><select name="form[]" data-show="true" data-name="c"><option value="" data-parent="child"></option><option value="d" data-parent="d">d</option></select>
[3] => <label>d</label><select data-required="true" name="form[]" data-show="true" data-name="d"><option value="" data-parent="child"></option><option value="w" data-parent="w">w</option></select>
[4] => <label>w</label><input name="form[]" data-show="true" data-parent="j" data-name="w" value="2" type="checkbox">
[5] => <label>توضیحات</label><textarea name="form[]" data-show="true" data-required="true" data-name="j"></textarea>
)

engmmrj
شنبه 07 تیر 1393, 12:32 عصر
هواسم نیود این یه مشکلی داره !br آخر هر html رو حذف میکنه

***BiDaK***
شنبه 07 تیر 1393, 12:45 عصر
هر سطر br نمیخواد.سطر آخر داشته باشه کافیه.البته تو نتایج نیاره.
اما اگه میخوای بعد هر سطر br بذاری خوب فرم مشخصی داره و regex راحتتری میشه نوشت:

preg_match_all('/\<label\>.+?\<br\>/i', $html, $match);

engmmrj
شنبه 07 تیر 1393, 12:53 عصر
بدون regex با تابع explode و کمک amin0256 درستش کردم :لبخند:

html = explode('<label>', $_POST['form']);

function appendHtml($html) {
return '<label>'.$html ;
}

$html = array_map('appendHtml', $html);
array_shift($html);

***BiDaK***
شنبه 07 تیر 1393, 13:00 عصر
بدون regex با تابع explode و کمک amin0256 درستش کردم :لبخند:

html = explode('<label>', $_POST['form']);

function appendHtml($html) {
return '<label>'.$html ;
}

$html = array_map('appendHtml', $html);
array_shift($html);
عنوان تاپیک regex هست و طبق اون بقیه میان نظر میدن.اتربیوت هاشم بگو با explode دربیاره.

shpegah
دوشنبه 09 تیر 1393, 15:05 عصر
این چطوره ؟


$patern='#(?s)<label>(.*?)<\/label>.*? data-name="([^"]*)".*?(?=<label>|\z)#i';
preg_match_all($patern, $html, $match);
var_dump($match);