PDA

Դիտել ողջ տարբերակը : Regular Expressions+PHP



XeS
02.10.2007, 10:08
Guys whats wrong with this expression it must delete from a string all data between tags and tags too

function stripTags($tag, $string) {

$regExp = '<" . "$tag" . "[^>]*>([\x20-\x7E]* | [ \t\r\n\v\f]*)*<\\" . "$tag" . "[^>]*';
$string = ereg_replace($regExp, "", $string);

return $string;
}

Մոդերատորական: Դար ակումբում գրառումների լեզուն հայերենն է: Օտարալեզու գրառումներն արգելվում են:

քաղաքացի
02.10.2007, 10:20
Բարև, խնդրում եմ անգլերեն մի գրեք, այստեղ հայկական ֆորում է, բայց մենք կփորձենք քեզ օգնել :)


function stripTags($tag, $string) {

$regExp = "<" . $tag . "[^>]*>(.*?)</" . $tag . "[^>]*";
$string = ereg_replace("%".$regExp."%/si", "", $string);

return $string;
}


Այ սենց պետք է աշխատի: Նախ ասեմ, որ կոդդ շատ վատ է գրած: Սկսում ես « ' »-ով հետ շարունակում ես « " »-ով: Սա շատ վատ գրելաձև է, և կարող ես լիքը կոնֆլիկտների առաջ կանգնել:

Egern.net
02.10.2007, 11:58
Քաղաքացի ջան, խնդրում եմ բացատրես regexp-իդ վերջին մասը.

"</" . $tag . "[^>]*"

ստացվում է, որ փակվող տեգում կարող են ուրիշ սիմվոլներ լինե՞ն, ասենք` ատրիբուտներ: Դա բացվող տեգում հասկանալի է, բայց փակվողում...

մեկ էլ, ամենավերջին > նշանը չկա

Ավելացվել է 11 րոպե անց
ու մի հարց. / նշանից առաջ պետք չի՞ \ դնել (preg_replace-ում պարտադիր է)

քաղաքացի
02.10.2007, 13:11
Քաղաքացի ջան, խնդրում եմ բացատրես regexp-իդ վերջին մասը.

"</" . $tag . "[^>]*"

ստացվում է, որ փակվող տեգում կարող են ուրիշ սիմվոլներ լինե՞ն, ասենք` ատրիբուտներ: Դա բացվող տեգում հասկանալի է, բայց փակվողում...

մեկ էլ, ամենավերջին > նշանը չկա

Ավելացվել է 11 րոպե անց
ու մի հարց. / նշանից առաջ պետք չի՞ \ դնել (preg_replace-ում պարտադիր է)
Ճիշտ ես ասում, ուղղակի վռազ էի, երկար չէի կարող կոդը նայել: Համենայն դեպս դժվար չի, ես շատ եմ անում:
Այ օրինակ ես հիմա ուրիշ պրոբլեմի վրա եմ, ահագին դժվար խնդիր է, միքիչ հետո կտեղադրեմ, փորձենք քննարկել:

Egern.net
02.10.2007, 18:09
շատ հետաքրքիր կլինի :)

քաղաքացի
02.10.2007, 18:20
Դե լավ, որ հետաքրքիր ա, ասեմ:
Ուրեմն խնդիրը հետևյալն է: Ունեմ HTML-ից մի հատված, ես ուզում եմ գտնեմ մի հատ DIV-ի innerHTML-ն: Ենթադրեն այդ DIV-ի id="aaa" և ես ուզում եմ դրա մեջինը:


<html>
<head>
<title>asdfasdf</title>
</head>
<body>
<div id="id1">
asdfasdfdf
</div>
<div id="aaa">
asdfasdf
<div>sdgfasdfg</div>
aasdf
</div>
<div id="id2">asdfasdf</div>
</body>
</html>

Հիմա ինձ պետք է այն DIV-ի մեջինը որի id="aaa" և ներառյալ մեջի եղած մյուս DIV-երը:
Բավականին տանջվել եմ: :)

Egern.net
02.10.2007, 19:48
սա իրոք բարդ է... հեսա մի քիչ մտածեմ...

Egern.net
02.10.2007, 21:44
$a = '([\s\S](?!\/div)(?!div))*'; //vor nerqev@ nuin ban@ 4 angam chgrem
$re = '/<div.+id=\"aaa\".*>('.$a.'(<div'.$a.'>'.$a.'<\/div>)*'.$a.')<\/div>/';
preg_match_all($re, $str, $arr);
print_r($arr[1]);


ինչ-որ բան ստացվեց: Այսինքն, քո տված օրինակով, ու իմ ստեղծած մի քանի օրինակներով աշխատեց: Բայց չեմ կարողանում հասկանալ, թե ինչի (?!.....)-ի մեջ չեմ կարողանում դնել < նշանը: Ու էդ պատճառով, եթե հանկարծ տեքստի մեջ հանդիպի div բառը, կոդը չի աշխատի....

Ավելացվել է 10 րոպե անց
մի հատ էլ ուղղում.

$re = '/<div.+id=\"aaa\".*>('.$a.'(<div'.$a.'>'.$a.'<\/div>'.$a.')*'.$a.')<\/div>/';
որպեսզի եթե լինեն մեկից ավելի ներքին div-եր ու նրանց արանքում ուրիշ տեքստ, էլի աշխատի

քաղաքացի
02.10.2007, 22:54
Հմմ… :think Հետաքրքիր է, հիմա կփորձեմ: Մինջ այդ ցույց տամ իմ գրածը, բայց չվախենաք :D


<?php
$i=1;
while (1)
{
$regex='%<div id="print_content">?(.*?(<div[^>]*>)?.*?</div>){0,'.$i.'}%si';
preg_match_all($regex,$subject,$out);
$i = substr_count($out[0][0],"<div");
$k = substr_count($out[0][0],"</div");
if($k==$i)break;
}
echo $out[0][0];
?>

Egern.net
02.10.2007, 23:40
վաաախ... :) էս ինչքան ես խորացել....

բայց աշխատո՞ւմ է, ինչ որ չեմ հասկանում, թե ոնց ա "հավաքվում" html-ը, թե՞ միանգամից ա ստացվում... չէ, քնելուս ժամն ա....

Universe
03.10.2007, 01:02
Քաղաքացի ջան, կներես, մի հատ հարց տամ.

<?php
$i=1;
while (1)
{
$regex='%<div id="print_content">?(.*?(<div[^>]*>)?.*?</div>){0,'.$i.'}%si';
preg_match_all($regex,$subject,$out);
$i = substr_count($out[0][0],"<div");
$k = substr_count($out[0][0],"</div");
if($k==$i)break;
}
echo $out[0][0];
?>
Ինչի՞ համարա այստեղ $i -փոփոխականին արժեք տվա՞ծ...
Եւ եթե խնդրեմ չե՞ք բացատրի մեկնումեկդ, թե այս կոդում որը ինչ է նշանակում, եւ ինչի համար է :oy...))

քաղաքացի
03.10.2007, 09:50
Բարլուս ձեզ: Կակռազ միքիչ զարթուն եմ :D
Ուրեմն $i փոփոխականին սկզբում տված է 1՝ $i=1;
while(1)-ը նշանակում է, անվերջ ցիկլ:
$regex` այստեղ առաջին հերթին գտնում է, <div id="print_content'> tag-ը: Հետո նայում է ուրիշ բացվող <div> tag-ի համար, որը կարող է չլինել և լինել անթիվ անգամ: Վերջում փակվում է </div>: { 0, $i } մասում, ես նրան ասում եմ, որ այն կրկնվի՝ այսինքն </div>-ը կրկնվի 0-ից $i անգամ:
Փաստորեն գտնում եմ առաջին փակվող div-ը:
$i = այդ հատվածում բացվող div-երի քանակը:
$k = այդ հատվածում փակվող div-երի քանակը:
Ցիկլը կավարդի այն դեպքում, երբ $k հավասարվի $iժ-ին, այսինքն երբ փակվող ու բացվող div-երը իրար հավասար են:

Հ.Գ. Գիտեմ շատ զզվելի կոդ է :[ :D

Հ.Հ.Գ. Egern.net կներես բայց դեռ չեմ նայել քո գրածը ու էլի թարս ժամանակ ա, հես գնամ գործի, նայեմ ;)

Egern.net
03.10.2007, 11:54
Այսինքն անընդհատ նույն արտահայտությունը նույն regexp-ով անցնում է, մինչև բոլոր ներքին դիվերը հաշվվեն.... :think .... երևի... :)

բայց վերջում echo $out[0][0]; նշանակում է, որ ոչ թե մեջինն է վերադարձնում, այլ ամբողջ div-ը: Տե՞նց էր պետք: Իմ գրածը innerHTML-ն է վերադարձնում

քաղաքացի
03.10.2007, 12:42
Egern.net բայց քո գրածը ինչ-որ լավ չի աշխատում: Հենց օրինակ իմ տված օրինակի (http://www.akumb.am/showthread.php?p=404341#post404341) համար, սխալ է աշխատում: Վարձնում է, առաջին բացվող div-ից վերջին փակվող div-ը:
Երևի մի բան սխալ ես գրել :think

Egern.net
03.10.2007, 14:08
:(

<?php
header("Content-type:text/plain");
$str = '
<html>
<head>
<title>asdfasdf</title>
</head>
<body>
<div id="id1">
id1
</div>
<div id="aaa">
aaa1
<div id="asa" st=s>bbb</div>
ss
<div id="as" st=s>bbb</div>
aaa2
</div>
<div id="id2">asdfasdf</div>
</body>
</html>
';
$a = '([\s\S](?!\/div)(?!div))*'; //vor nerqev@ nuin ban@ 4 angam chgrem
$re = '/<div.+id=\"aaa\".*>('.$a.'(<div'.$a.'>'.$a.'<\/div>'.$a.')*'.$a.')<\/div>/';
preg_match_all($re, $str, $arr);
print_r($arr[1]);
?>
ինձ մոտ նորմալ է, բացի իմ նշած դեպքից