Jump to content

Numerão Romana numa cadeia de texto


hbarquero
 Share

Recommended Posts

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.

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other 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);
}

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other 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);
?>
Link to comment
Share on other 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 😛

Link to comment
Share on other 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.

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.