Bruno Posted January 25, 2007 at 12:47 AM Report #78430 Posted January 25, 2007 at 12:47 AM Boas, estou aqui atrofiar com algo que deve ser mto simples... Quero apanhar o conteúdo entre [*] e [/*] em: [list] [*]01[/*][*]02[/*][*]03[/*] [*]04[/*] [*]05[/*] [*]06[/*] [/list] Alguém consegue ajudar-me?
Tool Posted January 25, 2007 at 12:57 AM Report #78432 Posted January 25, 2007 at 12:57 AM =X não percebi, podes ser mais especifico..? Engenharia de Redes e Sistemas Informáticos, DCC-FCUP. www.dcc.fc.up.pt
Bruno Posted January 25, 2007 at 01:04 AM Author Report #78433 Posted January 25, 2007 at 01:04 AM Quero apanhar o 01, 02, 03... por expressões regulares 😉
-IceBurn- Posted January 25, 2007 at 01:09 AM Report #78434 Posted January 25, 2007 at 01:09 AM Ora, tenta lá assim: <?php $string ="[list] [*]01[/*][*]02[/*][*]03[/*] [*]04[/*] [*]05[/*] [*]06[/*] [/list]"; preg_match_all("/(\[\*\])(.*?)(\[\/\*\])/i", $string, $conteudo); foreach($conteudo[2] as $valor) { echo "$valor<br/>"; } ?>
Tool Posted January 25, 2007 at 01:13 AM Report #78435 Posted January 25, 2007 at 01:13 AM fazes " (0\d*)+" , neste caso tb apanhas 00, ou 0, ou 000... e depois tb apanhas 09, 010, 111... não sei se é isso que queres. Se não for diz kualker coisa 😉 Engenharia de Redes e Sistemas Informáticos, DCC-FCUP. www.dcc.fc.up.pt
Bruno Posted January 25, 2007 at 01:15 AM Author Report #78437 Posted January 25, 2007 at 01:15 AM Funciona mas não é o que pretendo Faltou referenciar q tem de ter [list] antes e [/list] depois :$ Obrigado Tool: é suposto apanhar caracteres tb 😄
Tool Posted January 25, 2007 at 01:20 AM Report #78438 Posted January 25, 2007 at 01:20 AM preg_match_all("/\[List\]((\[\*\])(.*?)(\[\/\*\]))*\[List\]/i", $string, $conteudo); Engenharia de Redes e Sistemas Informáticos, DCC-FCUP. www.dcc.fc.up.pt
Bruno Posted January 25, 2007 at 01:23 AM Author Report #78439 Posted January 25, 2007 at 01:23 AM Pois, isso não funciona 😉
-IceBurn- Posted January 25, 2007 at 01:55 AM Report #78441 Posted January 25, 2007 at 01:55 AM É assim, isto não é certamente o método mais indicado, mas assim de repente, aqui vai: <?php $string ="[*]ab[/*][list][*]01[/*][*]02[/*][*]03[/*][*]04[/*][*]05[/*][*]06[/*][/list][*]cd[/*]"; preg_match_all("/(\[list\])(.*?)(\[\/list\])/i", $string, $valor); $x = ""; foreach($valor[2] as $valor) { $x .= $valor; } preg_match_all("/(\[\*\])(.*?)(\[\/\*\])/i", $x, $conteudo); foreach($conteudo[2] as $valor) { echo "$valor<br/>"; } ?>
Guest id194 Posted January 25, 2007 at 04:02 AM Report #78447 Posted January 25, 2007 at 04:02 AM $txt = "[*]Italico[/*] xyz[*]Italico[/*]xyz[*]Italico[/*][*]Italico[/*] [*]Italico[/*]"; $new = preg_replace("#\[\*\](.+?)\[/\*\]#is", " <em>\\1</em> ", $txt); echo "<strong>ORIGINAL:</strong> $txt<br /><strong>NOVO:</strong> $new"; Isto funciona para o que tu queres, penso eu... Mas pelo que vi, tu estás a fazer listas de items tipo bbcode e o código que eu tenho para isso, é o seguinte: $preg = array( "#\[list\](\r\n)?(.+?)\[/list\]#is" => "<ul>\\2</ul>", "#\[list=(a|A|i|I|1)\](.+?)\[/list\]#is" => "<ol type=\"\\1\">\\2</ol>", "#\[\*\](.+?)(\r|\[\*\])#" => "<li>\\1</li>\\2", "#</li>\[\*\](.+?)(\r|\[\*\])#" => "<li>\\1</li>\\2", "#(</li>\[\*\]|\[\*\])(.+?)</ul>#" => "<li>\\2</li></ul>", ); $str = "[list][*]Item 1[*]Item 2[*]Item 3[/list]"; $str = preg_replace(array_keys($preg), array_values($preg), $str);
Bruno Posted January 25, 2007 at 04:10 AM Author Report #78448 Posted January 25, 2007 at 04:10 AM O teu 1º não funciona para o que quero, relativamente ao segundo é excelente 😄 Só lhe vejo um defeito 😉 É não permitir outro list dentro do list (como o BBCode permite). Se adaptares o teu coloca aí que agradeço 😄 Obrigado pelas ajudas :fixe EDIT: Já agora isto parece-me falhar no teu código: $str = "[list=1][*]Item 1[*]Item 2[*]Item 3[/list]"; O 3º aparece-me com * em vez de 3. 😛
nakib Posted January 25, 2007 at 04:51 AM Report #78449 Posted January 25, 2007 at 04:51 AM O Nazgulled foi dormir porque tem exame amanhã, mas ele tava agora aqui ao meu lado e disse que amanhã te respondia... EDIT: Já agora isto parece-me falhar no teu código: $str = "[list=1][*]Item 1[*]Item 2[*]Item 3[/list]"; O 3º aparece-me com * em vez de 3. 😉 Isto não funciona para o primeiro ou segundo Código??? Tanto um como outro foram testados e funcionaram comigo.
pedrotuga Posted January 25, 2007 at 09:39 AM Report #78457 Posted January 25, 2007 at 09:39 AM porque é que dizes que nao permite listas dentro de listas? o que é que acontece? Eu nao domino regex, costumo ler documentação aqui e ali qdo preciso. No entanto posso dar uma dica em relação a uma coisa que me lembro. Neste tipo de situações e quando podem esta um 'objecto' dentro de outro 'objecto', cada vez que usas o metacaracter correspondente a uma ou mais ocorrencia de qualquer caracter, deves activar a opcao greedy ( por default está a off ) para encontrar a ocorrencia de menos comprimento. Isto faz-se com um ponto de interrogação a seguir ao metacaracter... assim sendo, cada vez que quiseres encontra "qq coisa aqui" usa: .*? Ja agora... n tenhas medo de usar software open source. Nestes casos costumo ir a http://phpxref.com , clico por exemplo num script de forums e uso o parser deles.
kingless Posted January 25, 2007 at 10:16 AM Report #78458 Posted January 25, 2007 at 10:16 AM @Bruno Se tu explicasses exactamente o que queres fazer talvez fosse mais fácil te ajudar.
shumy Posted January 25, 2007 at 10:31 AM Report #78459 Posted January 25, 2007 at 10:31 AM Pois explica melhor o que queres apanhar, porque se for 01,02,03 então: 0[123456789] deve servir. Eu burro!!! 0[1-9] Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
Bruno Posted January 25, 2007 at 12:44 PM Author Report #78470 Posted January 25, 2007 at 12:44 PM O Nazgulled foi dormir porque tem exame amanhã, mas ele tava agora aqui ao meu lado e disse que amanhã te respondia... Ok 😉 EDIT: Já agora isto parece-me falhar no teu código: $str = "[list=1][*]Item 1[*]Item 2[*]Item 3[/list]"; Isto não funciona para o primeiro ou segundo Código??? Tanto um como outro foram testados e funcionaram comigo. Não funciona no 2º... o 3º dá-me asterisco em vez de "3.". De qq modo eu não preciso da funcionalidade de escolher o tipo de lista (se 1, a, A.... basta o dos * e isso eu consigo adaptar dali 😛 ) .*? Ja agora... n tenhas medo de usar software open source. Nestes casos costumo ir a http://phpxref.com , clico por exemplo num script de forums e uso o parser deles. Sim eu sei disso, mas eu não quero apanhar qq coisa, mas sim permitir apanhar a mm várias vezes. Eu conheço o software mas não me ajuda neste caso 😄 @Bruno Se tu explicasses exactamente o que queres fazer talvez fosse mais fácil te ajudar. Eu quero interpretar o BBCode do list do forum... Tem de começar e acabar com [list] (no que acaba tem de ter [/list]) e cada linha tem o [*] (caso simplifique pode acabar com [/*]). E por fim, deverá permitir vários [list] dentro de outros, para tornar os efeitos assim: Primeiro SegundoSegundo (1) Segundo (2)Segundo (3)(1) [*]Terceiro
Rui Carlos Posted January 25, 2007 at 12:52 PM Report #78472 Posted January 25, 2007 at 12:52 PM não podias substituir o [ list ] por <ul>, o [ * ] por <li>, etc. directamente? não sei quantos níveis de list's "encadadeados" tencionas permitir, mas se não houver limite, isso é impossível de fazer com ER's (a menos que as ER's do php sejam mais expressivas do que as matemáticas, o que duvido). Rui Carlos Gonçalves
Guest id194 Posted January 25, 2007 at 06:21 PM Report #78565 Posted January 25, 2007 at 06:21 PM Não estou bem a entender o que não está a funcionar... <?php $preg = array( "#\[list\](\r\n)?(.+?)\[/list\]#is" => "<ul>\\2</ul>", "#\[list=(a|A|i|I|1)\](.+?)\[/list\]#is" => "<ol type=\"\\1\">\\2</ol>", "#\[\*\](.+?)(\r|\[\*\])#" => "<li>\\1</li>\\2", "#</li>\[\*\](.+?)(\r|\[\*\])#" => "<li>\\1</li>\\2", "#(</li>\[\*\]|\[\*\])(.+?)</ul>#" => "<li>\\2</li></ul>", ); $str = "[list][*]Item 1[*]Item 2[*]Item 3[/list]"; $str = preg_replace(array_keys($preg), array_values($preg), $str); echo $str; ?> Isto não funciona ai? É que aqui, apareceu tudo bem... Diz exactamente o que está a falhar que não estou a perceber. E tu queres ou não permitir lists dentro de lists?
Guest id194 Posted January 25, 2007 at 07:37 PM Report #78589 Posted January 25, 2007 at 07:37 PM Tive aqui a fazer isto, experimenta: <?php function GetLists($buffer) { // NAO PERMITE SUBLISTAS /*$preg = array( "#\[\*\](.+?)(\r\n|<li>|\[\*\]|\[/list\])#is" => "<li>\\1</li>\\2", "#\[\*\](.+?)(\r\n|<li>|\[/list\])#is" => "<li>\\1</li>\\2", "#\[list\](.+?)\[/list\]#is" => "<ul>\\1</ul>", "#\[list=(a|A|i|I|1)\](.+?)\[/list\]#is" => "<ol type=\"\\1\">\\2</ol>", );*/ // PERMITE SUBLISTAS (APENAS 2 NIVEIS) $preg = array( "#\[\*\](.+?)(\r\n|<li>|\[\*\]|\[/list\])#is" => "<li>\\1</li>\\2", "#\[\*\](.+?)(\r\n|<li>|\[/list\])#is" => "<li>\\1</li>\\2", "#\[list\](.+?)\[/list\]#is" => "<ul>\\1</ul>", "#\[list\]</li>(.+?)\[/list\]#is" => "<ul>\\1</ul>", "#\[list=(a|A|i|I|1)\](.+?)\[/list\]#is" => "<ol type=\"\\1\">\\2</ol>", "#\[list=(a|A|i|I|1)\]</li>(.+?)\[/list\]#is" => "<ol type=\"\\1\">\\2</ol>", ); return (preg_replace(array_keys($preg), array_values($preg), $buffer)); } ob_start("GetLists"); ?> [list] [*]Item 1 [*]Item 2 [*]Item 3 [*]Item 4 [/list] <br /> [list] [*]Item 1 [*]Item 2[list] [*]Item 1 [*]Item 2 [*]Item 3 [*]Item 4 [/list] [*]Item 3 [*]Item 4 [/list] <br /> [list] [*]Item 1[*] Item 2 [*] Item 3 [*]Item 4[/list] <br /> [list][*]Item 1 [*]Item 2 [*]Item 3[*]Item 4 [/list] <br /> [list][*]Item 1 [*]Item 2 [*]Item 3[list][*]Item 1 [*]Item 2 [*]Item 3[*]Item 4 [/list][*]Item 4 [/list] <br /> [list][*]Item 1 [*]Item 2 [*]Item 3[*]Item 4[/list] <br /> [list][*]Item 1[*]Item 2 [*]Item 3[*]Item 4 [/list] <br /> [list][*]Item 1[*]Item 2[list][*] Item 1 [*] Item 2 [*] Item 3 [*] Item 4 [/list][*]Item 3[*]Item 4[/list] <br /> [list][*] Item 1[*] Item 2[*]Item 3[*] Item 4[/list] <br /> [list] [*] Item 1[*] Item 2[*]Item 3[*] Item 4[/list] <br /> [list][*] Item 1[*] Item 2[*]Item 3[*] Item 4 [/list] <br /> [list][*] Item 1 [*] Item 2[list][*]Item 1[*]Item 2[*]Item 3[*]Item 4[/list] [*] Item 3 [*] Item 4 [/list] <br /> [list][*] Item 1 [*] Item 2 [*] Item 3 [*] Item 4 [/list] <?php ob_end_flush(); ?>
Bruno Posted January 25, 2007 at 09:31 PM Author Report #78623 Posted January 25, 2007 at 09:31 PM Dá-me mais 2h e já teste, respondo, etc 🙂
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now