2010-08-26 11 views
6

Esiste un modo semplice per sostituire una stringa in/a in una stringa per concordare con la seguente parola - più o meno come la modalità "S" funziona in formato Data?Corretta forma di articolo indefinito (a, an) in stringhe PHP

ad es.

$apple = 'apple'; 
$pear = 'pear'; 
echo "This is a $apple, this is a $pear." 

--> This is an apple, this is a pear 
+1

Questo suona come un preg_replace usando un'espressione regolare condizionale. Vedi: http://www.regular-expressions.info/lookaround.html – Chris

+1

Questo è un ottimo link. – Leo

+0

Questo non può MAI funzionare completamente :) L'inglese qui ha troppe insidie. Per esempio. 'A University' è la forma corretta anche se la parola inizia con un' u'. Lo stesso con 'an H ...' in molti casi, se la consonante tace e non si pronuncia. – mark

risposta

6

Prova questo:

$l = array('a apple is a fruit', 'a banana is also a fruit'); 

foreach($l as $s) { 
    $s = preg_replace('/(^|)a ([aeiouAEIOU])/', '$1an $2', $s); 
    echo $s,"\n"; 
} 

uscita:

an apple is a fruit 
a banana is also a fruit 
+0

necessario per utilizzare [aeiouAEIOU] come per un titolo in cui le parole significative sono in maiuscolo. Grazie. – Leo

+0

Giusto, ho aggiunto le lettere maiuscole. – Toto

+4

Un'università ha trascorso un'ora a cercare una risposta SO per trovare le cose sbagliate ... –

2

non è sicuro se funziona in PHP che modo, ma una soluzione molto semplice potrebbe essere:

$string = preg_replace('/\ba\b\s([aeiou])/', 'an $1', $string); 
$string = preg_replace('/\ban\b\s([^aeiou])/', 'an $1', $string); 

(Non sono sicuro circa l'un/una regola in quanto non v'è alcuna regola in tedesco e io di solito utilizzare quello che suona meglio)

Spiegazione:

\ b è un confine di parola, così \ ba \ b cerca la parola una, seguito da uno spazio e una delle lettere [aeiou]. La lettera viene acquisita a $ 1 e l'espressione viene sostituita con an seguita dalla lettera acquisita.

+1

Grazie - uguale primo posto con M42. – Leo

6

si potrebbe usare un'espressione regolare per scambiare l'a/e, a seconda di ciò che lo segue. La parte più complicata sarà in realtà la definizione di tutti i casi su cui scambiare - è più complicato quindi "se è seguito da una vocale".

Quando utilizzare un/una:

Utilizzare un prima parole/le abbreviazioni che iniziano con una consonante; usa le parole/abbreviazioni precedenti che iniziano con un suono vocale. Questo è basato sulla pronuncia, non sull'ortografia.

qui:

  • un'università
  • un'ora
  • una molecola di itterbio
  • un cane giallo
  • un U
  • una M

Inizio di una regex per risolverlo

$text = preg_replace("/(?=a|e|i|o|u|yt)a/", "an", $text); 
+0

la regex è sbagliata. afferma che inizia nella posizione di un a. – muhmuhten

+3

Bah, il mio punto era il linguaggio piuttosto che la regex/funzione usata, che è piuttosto semplice. Fare uno scambio base a seconda che "a" sia seguito da una vocale non è la forma corretta di un articolo indefinito. – danielgwood

+0

Hai fatto alcuni punti interessanti. L'uso comune è la chiave per questo. Un hotel è corretto, ma l'uso effettivo e la pronuncia dipendono da dove si trova nel paese (Inghilterra), tra le altre cose. Pertanto, un hotel è ugualmente corretto. Facendo altre distinzioni, ad es. un'università, un ombrello non è fatto facilmente algoritmicamente. – Leo

0

ho usato la risposta di Luca Chaver per scrivere un php frammento di rapido e brutto per fare gestire questo

<?php 
//code inspired by https://github.com/Kaivosukeltaja/php-indefinite-article/blob/master/IndefiniteArticle.class.php 
global $indef_A_abbrev, $indef_A_y_cons, $indef_A_explicit_an, $indef_A_ordinal_an, $indef_A_ordinal_a; 

$indef_A_abbrev = "(?! FJO | [HLMNS]Y. | RY[EO] | SQU 
      | (F[LR]? | [HL] | MN? | N | RH? | S[CHKLMNPTVW]? | X(YL)?) [AEIOU]) 
      [FHLMNRSX][A-Z] 
     "; 
$indef_A_y_cons = 'y(b[lor]|cl[ea]|fere|gg|p[ios]|rou|tt)'; 
$indef_A_explicit_an = "euler|hour(?!i)|heir|honest|hono"; 
$indef_A_ordinal_an = "[aefhilmnorsx]-?th"; 
$indef_A_ordinal_a = "[bcdgjkpqtuvwyz]-?th"; 

function indefinite_article($input){ 
    global $indef_A_abbrev, $indef_A_y_cons, $indef_A_explicit_an, $indef_A_ordinal_an, $indef_A_ordinal_a; 
    $word = preg_replace("^\s*(.*)\s*^", "$1", $input); 
    if(preg_match("/^[8](\d+)?/", $word)) { 
     return "an $word"; 
    } 
    if(preg_match("/^[1][1](\d+)?/", $word) || (preg_match("/^[1][8](\d+)?/", $word))) { 
     if(strlen(preg_replace(array("/\s/", "/,/", "/\.(\d+)?/"), '', $word))%3 == 2) { 
      return "an $word"; 
     } 
    } 
    if(preg_match("/^(".$indef_A_ordinal_a.")/i", $word))  return "a $word"; 
    if(preg_match("/^(".$indef_A_ordinal_an.")/i", $word))  return "an $word"; 
    if(preg_match("/^(".$indef_A_explicit_an.")/i", $word))   return "an $word"; 
    if(preg_match("/^[aefhilmnorsx]$/i", $word))  return "an $word"; 
    if(preg_match("/^[bcdgjkpqtuvwyz]$/i", $word))  return "a $word"; 
    if(preg_match("/^(".$indef_A_abbrev.")/x", $word))   return "an $word"; 
    if(preg_match("/^[aefhilmnorsx][.-]/i", $word))   return "an $word"; 
    if(preg_match("/^[a-z][.-]/i", $word))   return "a $word"; 
    if(preg_match("/^[^aeiouy]/i", $word))     return "a $word"; 
    if(preg_match("/^e[uw]/i", $word))      return "a $word"; 
    if(preg_match("/^onc?e\b/i", $word))     return "a $word"; 
    if(preg_match("/^uni([^nmd]|mo)/i", $word))  return "a $word"; 
    if(preg_match("/^ut[th]/i", $word))      return "an $word"; 
    if(preg_match("/^u[bcfhjkqrst][aeiou]/i", $word)) return "a $word"; 
    if(preg_match("/^U[NK][AIEO]?/", $word))    return "a $word"; 
    if(preg_match("/^[aeiou]/i", $word))   return "an $word"; 
    if(preg_match("/^(".$indef_A_y_cons.")/i", $word)) return "an $word"; 
    return "a $word"; 
} 

$words = array(
    "historical", 
    "hour", 
    "wholesale", 
    "administrator", 
    "inner circle" 
); 
foreach ($words as $word) { 
    echo indefinite_article($word); 
    echo "\n"; 
} 

?> 
0

ho biforcato il modulo Luca Chavers fa riferimento, pulirlo, la fissazione di un errore logico e rendendolo integrabile usando Composer; con quello installato, si può tirare nel vostro progetto con:

php composer.phar require thaumatic/indefinite-article 

Il codice sorgente è a https://github.com/thaumatic/indefinite-article.