Verwenden von preg_replace zum Filtern von benutzerdefiniertem Textbereich

Ich entwickle einen custom post type , der unter anderem die Möglichkeit enthält, eine E-Mail vom Post-Editor aus zu versenden. Der Textbereich der E-Mail-Nachricht wird über eine Seite mit benutzerdefinierten Einstellungen post_meta array und in einem post_meta array das auch die E-Mail und den Betreff enthält. Bis hier alles in Ordnung.

Der Standard-E-Mail-Inhalt der Einstellungsseite enthält %%PROPOSAL_LINK%% und %%PROPOSAL_LINK_URL%% die herausgefiltert und durch einen HTML-Link und einen normalen Link zum Permalink des %%PROPOSAL_LINK_URL%% werden sollen, von dem die E-Mail stammt.

Das Folgende ist die function, wie ich sie gerade habe:

 function filter_email_text_for_post_link( $post ) { // retrieve the 'proposal_email' post_meta (array) $post_meta = get_post_meta( $post->ID, 'proposal_email', TRUE ); // retrieve email body 'proposal_email_text' from array $email_content = $post_meta['proposal_email_text']; // bail if email has no content if( $email_content == '' ){ return; } // patterns to look for in email body $link_pattern = '%%PROPOSAL_LINK%%'; $url_pattern = '%%PROPOSAL_LINK_URL%%'; // returns for each pattern $proposal_link = 'here'; $porposal_link_url = get_permalink( $post_id ); // match and replace with the above patterns $email_content = str_replace( $link_pattern, $proposal_link, $email_content ); $email_content = str_replace( $url_pattern, $proposal_link_url, $email_content ); // update the post_meta $post_meta['proposal_email_text'] = $email_content; update_post_meta( $post->ID, 'proposal_email', $post_meta ); } add_action( 'save_post', 'filter_email_text_for_post_link' ); 

Aus irgendeinem Grund funktioniert das einfach nicht. überhaupt keine Fehler, nichts! Anfangs habe ich versucht, diese function (leicht bearbeitet) in der function aufzurufen, die die Daten auf save_post speichert, aber auch nicht funktionierte.

Irgendwelche Vorschläge?

Danke im Voraus.

Solutions Collecting From Web of "Verwenden von preg_replace zum Filtern von benutzerdefiniertem Textbereich"

preg_replace erwartet, dass die Regex von einem Zeichen umgeben ist. Normalerweise ist das ein Schrägstrich, so:

 '/.*/' 

Wenn Sie dies tun:

 preg_replace('%%PROPOSAL_LINK_URL%%', $some_text, $replacement); 

preg_replace denkt, dass die ersten zwei % die umgebenden Zeichen sind, und scheitert an einem nicht erkannten Modifikator. Dies ist einfach zu testen:

 $ php -a Interactive shell php > echo preg_replace('%%PROPOSAL_LINK_URL%%', '%%PROPOSAL_LINK_URL%%', 'here'), PHP_EOL; PHP Warning: preg_replace(): Unknown modifier 'P' in php shell code on line 1 PHP Stack trace: PHP 1. {main}() php shell code:0 PHP 2. preg_replace() php shell code:1 Warning: preg_replace(): Unknown modifier 'P' in php shell code on line 1 Call Stack: 28.9460 235264 1. {main}() php shell code:0 28.9460 236016 2. preg_replace() php shell code:1 php > 

Sie haben zwei Möglichkeiten:

Ändern Sie Ihre Muster in etwa so: /%%PROPOSAL_LINK_URL%%/ und /%%PROPOSAL_LINK%%/

 $ php -a Interactive shell php > echo preg_replace('/%%PROPOSAL_LINK_URL%%/', '%%PROPOSAL_LINK_URL%%', 'here'), PHP_EOL; here 

Vergiss alles über preg_replace weil du es nicht brauchst. Verwenden str_ireplace stattdessen str_replace oder str_ireplace .

 < ?php str_replace('%%PROPOSAL_LINK_URL%%', $proposal_link_url, $email_content); str_ireplace('%%PROPOSAL_LINK%%', $proposal_link, $email_content); 

str_replace Sie, dass str_replace und seine Brüder nicht sicher für Zeichenfolgen sind, die Multi-Byte-Zeichen (z. B. UTF-8) standardmäßig enthalten. Sie können dies ändern .

HINWEIS: Sie haben $link_pattern zweimal in Ihren Codebeispielen verwendet. Ich denke, du meinst, der zweite ist $url_pattern .

BEARBEITEN: es scheint, dass es kein mb_* Ersatz für str_replace oder str_ireplace dieser Kommentar auf php.net wirft etwas Licht auf das Problem. str_replace sollte auf Multibyte-Strings funktionieren, sofern die Codierung von Nadel und Heuhaufen gleich ist.

Ihr Problem ist eine nicht-entkommene Regex. Sie brauchen jedoch nicht preg_replace , nur einen str_replace

 $email_content = str_replace( $link_pattern, $proposal_link, $email_content ); $email_content = str_replace( $link_pattern, $porposal_link_url, $email_content ); 

FYI, der richtige Weg für die Regex ist in diesem Fall:

 $link_pattern = preg_quote('%%PROPOSAL_LINK%%'); $email_content = preg_replace( '/' . $link_pattern . '/', $proposal_link, $email_content); 

Die letzte, funktionierende function:

Im Vergleich zu meiner ursprünglichen function endete die Verwendung von str_replace von preg_replace da der resultierende Code kürzer und schneller war. Außerdem wurden dem add_action Aufruf zwei Argumente add_action , wodurch die Verwendung von Global $post entfällt; Außerdem wurden $post_meta['proposal_email_text'] entfernt, falls $post_meta['proposal_email_text'] nicht gesetzt wurde (neuer Beitrag).

 function filter_email_text_for_post_link( $post_id, $post ) { // retrieve the 'proposal_email' post_meta (array) $post_meta = get_post_meta( $post->ID, 'proposal_email', TRUE ); // retrieve email body 'proposal_email_text' from array if( ! empty( $post_meta['proposal_email_text'] ) ){ $email_content = $post_meta['proposal_email_text']; } else { return; } // bail if email has no content if( $email_content == '' ){ return; } // patterns to look for in email body $link_pattern = '%%PROPOSAL_LINK%%'; $url_pattern = '%%PROPOSAL_LINK_URL%%'; // returns for each pattern $proposal_link = 'here'; $proposal_link_url = get_permalink( $post_id ); // match and replace with the above patterns $email_content = str_replace( $link_pattern, $proposal_link, $email_content ); $email_content = str_replace( $url_pattern, $proposal_link_url, $email_content ); // update the post_meta $post_meta['proposal_email_text'] = $email_content; update_post_meta( $post->ID, 'proposal_email', $post_meta ); } add_action( 'save_post', 'filter_email_text_for_post_link', 10, 2 );