• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

hbarquero

Numerão Romana numa cadeia de texto

8 mensagens neste tópico

Boas tardes,

num projecto que estou a desenvolver tenho um cadeia de texto (nome de um curso), o qual estou a importar de uma tabela já existente.

Umas das coisas que tenho de fazer é colocar as inicias de cada palavra em maiúscula, menos as chamadas stop words (e, de, a, etc...), essa parte esta feita.

O meu problema neste momento é em detectar numeração Romana nessa mesma cadeia.

Gostava de saber se alguém tem algo do género feito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se entendi bem, o que tens de fazer é separar as palavras da string e criar um array com a numeração romana, que quando encontrada isolada como uma palavra, aplicas o que quiseres.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei isso Yoda, a minha questão era mais se alguém já tinha feito algo parecido.

Porque o criar de novo eu sei como fazer :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo google não vi nada, e duvido que alguém tenha feito isso (não é muito comum), pelo que se fizeres tu, deixa por aqui para ser inserido na wiki :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por enquanto já tenho algo a funcionar.

Fica aqui então o 1º exemplo, isto porque vou melhorar a função. Neste caso a função le palavra a palavra, e verifica se uma determinanda palavra tem so caracteres romanos, o que transforma em caractares maisuculos.

A função tambem coloca todas as letras das palavras em minusculas, sendo que a primeira letra de cada palavra fica a maiscula, menos as tais chamanas StopWords.

Como referi, vou ainda trabalhar nela, para detectar os numeros romanos em situações por exemplo (Curso de Programação-XX), neste caso, o  numero esta metido na palvra (Programação-XX), falta criar um array com possiveis simbolos a inserir numa palavra, que antecedam um numero romano.

aqui esta a 1ª função:

function propercase($string) {

/*stop words to put in lower case*/
$stop_words=array("e","de","um","uma","a","o"); /* Estas são apenas as de exemplo, há muitas mais*/

/*Roman LETERS*/
            $roman=array("I","V","X","L","C","D","M");
   
/*set all words to lowercase and then put the 1st letter of all words in upercase */
$string=ucwords(mb_strtolower($string,"UTF-8"));

/*explode the string to check for stop words*/
$strings=explode(" ",$string);
$result="";
foreach ($strings as $indice=>$piece) {
	/*if found stop word in array put them in lowercase*/
	if (in_array(mb_strtolower($piece,"UTF-8"),$stop_words)) { 
		$result.=mb_strtolower($piece,"UTF-8"); 
	} else { 

		/*check if all the leters in the string are ROMAN*/	
		$valid=0;
		for ($i = 0; $i < strlen($piece); $i++) {
		  if (in_array(mb_strtoupper($piece[$i]),$roman)) {
		  	$valid++;
		  }
		}
		/*If all leteres are ROMAN set to Upercase*/
		if ($valid==strlen($piece)) {
			$piece=mb_strtoupper($piece);
		}

		/*Add the result word to string*/
		$result.=$piece;
	}

	/*Add withe space after each word*/
	$result.=" ";
}
    
/*Return Result witout the last whitspace*/	
return substr($result,0,-1);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Citando do site php.net (ver em http://www.php.net/manual/en/language.operators.array.php#46987)

<?php
    function roman ($nr ) {
     $base_digits= array (
           1=> "I", 
           10=> "X", 
           100=> "C", 
           1000=> "M", 
           );
     $help_digits= array (
           5=> "V", 
           50=> "L", 
           500=> "D", 
           );
     $all_digits= $base_digits+ $help_digits;
     foreach ($base_digits as $key1=> $value1 )
           foreach ($all_digits as $key2=> $value2 )
                 if ($key1< $key2 && $key1 >= ($key2 / 10)) 
                       $segments[$key2- $key1 ]= $value1. $value2;
     $segments+= $all_digits;
     krsort ($segments );
     foreach ($segments as $key=> $value )
           while ($key<= $nr ) {
                 $nr-= $key;
                 $str.= $value;
                 }
     return $str;
     }
?>

Usando a função acima ao gerar o array :)

<?php
# Vamos criar um array de "randoms" com indices de 1 a 65 (Não existe 0 na numeração romana xD LOL)
$novo_array = array();
for($contador=1;$contador<66;$contador++)
    $novo_array[roman($contador)] = mt_rand();

var_dump($novo_array);
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oh :x ignorem o meu post anterior... só depois é que li com mais atenção a dúvida...

Anyway, fica aí o código :)

Mas já agora uma dúvida...

Então quer dizer... Imagina que tenho a seguinte string:

VIAGENS-XX ... VI é um número válido :|...

Se todas as palavras obedecessem a um formato específico, bastava adicionar um parâmetro $format onde especificavas o formato que a string teria :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
VIAGENS-XX ... VI é um número válido :|...

Nesse caso teria de ficar Viagens-XX, ou seja, o que eu já tenho feito neste momento verifica não só palavra a palavra, como vai separar cadeias de texto como a que acabas-te de colocar, exemplo (VIAGENS.XX ou mesmo VIAGENS,XX) ou seja, onde não haja espaços.

A alteração para Numero Romanos, é feita se uma determinada palavra "XX", tiver apenas caracteres romanos, teoricamente será um numero. Não é 100% garantido, pois ainda estou a limar umas arestas na função que estou a fazer, mas assim que a tiver terminado coloco-a aqui completa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora