Αναζήτηση και Αντικατάσταση Κειμένου σε Παρουσιάσεις PowerPoint σε PHP
Επισκόπηση
Το Aspose.Slides για PHP μέσω Java μπορεί να αναζητήσει, να επισημάνει και να αντικαταστήσει κείμενο σε ένα μεμονωμένο πλαίσιο κειμένου ή σε ολόκληρη την παρουσίαση. Κάθε λειτουργία μπορεί επίσης να ειδοποιεί μια εφαρμογή για κάθε αντιστοίχηση μέσω μιας κλήσης επιστροφής αποτελέσματος. Αυτό καθιστά δυνατή την ενημέρωση μιας παρουσίασης και ταυτόχρονα τη δημιουργία ενός αρχείου ελέγχου που περιέχει το αντιστοιχισμένο κείμενο, το πλαίσιο του, τη θέση, το πλαίσιο κειμένου και τον αριθμό της διαφάνειας.
Αυτές οι δυνατότητες είναι χρήσιμες για ανασκόπηση, διαγραφή, έλεγχο ορολογίας, καθαρισμό προτύπων και αυτοματοποιημένες ροές εργασίας αναφοράς.
Στα πρώτα παραδείγματα παρακάτω, χρησιμοποιούμε ένα αρχείο με το όνομα “sample.pptx”, το οποίο περιέχει ένα μόνο πλαίσιο κειμένου στην πρώτη διαφάνεια με το ακόλουθο κείμενο:

Επιλέξτε το Πεδίο Αναζήτησης
Χρησιμοποιήστε μεθόδους στο TextFrame για να περιορίσετε μια λειτουργία σε ένα πλαίσιο κειμένου. Χρησιμοποιήτε μεθόδους στο Presentation για να επεξεργαστείτε όλο το κείμενο που ισχύει στην παρουσίαση.
| Λειτουργία | Ένα πλαίσιο κειμένου | Ολόκληρη η παρουσίαση |
|---|---|---|
| Επισήμανση κυριολεκτικού κειμένου | TextFrame::highlightText | Presentation::highlightText |
| Επισήμανση αντιστοιχίσεων κανονικής έκφρασης | TextFrame::highlightRegex | Presentation::highlightRegex |
| Αντικατάσταση κυριολεκτικού κειμένου | TextFrame::replaceText | Presentation::replaceText |
| Αντικατάσταση αντιστοιχίσεων κανονικής έκφρασης | TextFrame::replaceRegex | Presentation::replaceRegex |
Διαμορφώστε την Αντιστοίχηση Κειμένου
Για λειτουργίες κυριολεκτικού κειμένου, χρησιμοποιήστε το TextSearchOptions για να ελέγξετε την αντιστοίχηση:
- TextSearchOptions::setWholeWordsOnly περιορίζει τις αντιστοιχίες σε ολόκληρες λέξεις.
- TextSearchOptions::setCaseSensitive ελέγχει αν πρέπει να ταιριάζει η διάκριση κεφαλαίων/μικρών.
- TextSearchOptions::setIncludeNotes περιλαμβάνει τις σημειώσεις διαφάνειας σε λειτουργίες αναζήτησης, αντικατάστασης και επισήμανσης σε επίπεδο παρουσίασης.
Οι λειτουργίες κανονικής έκφρασης χρησιμοποιούν ένα Java Pattern, ώστε οι κανόνες αντιστοίχισης όπως η διάκριση κεφαλαίων/μικρών και τα όρια λέξεων να ορίζονται από την έκφραση και τις σημαίες της.
Καθορίστε τον Ιδιοκτήτη ενός Πλαισίου Κειμένου
Γενικές ροές επεξεργασίας κειμένου συχνά λαμβάνουν ένα [TextFrame] κατά την αναζήτηση, αντικατάσταση, επικύρωση ή εξαγωγή κειμένου. Χρησιμοποιήστε τα [TextFrame::getParentShape] και [TextFrame::getParentCell] για να προσδιορίσετε ποιο αντικείμενο παρουσίασης κατέχει το πλαίσιο κειμένου.
Οι αναμενόμενες τιμές εξαρτώνται από τον ιδιοκτήτη:
| Ιδιοκτήτης πλαισίου κειμένου | getParentShape |
getParentCell |
|---|---|---|
| Ένα AutoShape ή άλλο σχήμα που περιέχει κείμενο | Το κυρίως Shape | null |
| Ένα κελί πίνακα | null |
Το κυρίως Cell |
Και οι δύο μέθοδοι παρέχουν πλοήγηση μόνο για ανάγνωση. Η κλήση τους δεν μετακινεί το πλαίσιο κειμένου ούτε αλλάζει τον ιδιοκτήτη του. Ο γενικός κώδικας πρέπει να ελέγχει και τις δύο τιμές με java_is_null και να διαχειρίζεται την πιθανότητα να μην είναι διαθέσιμος κανένας ιδιοκτήτης.
Το παρακάτω παράδειγμα χρησιμοποιεί το SlideUtil::getAllTextFrames για να επαναλάβει όλα τα πλαίσια κειμένου σε μια παρουσίαση. Για σχήματα, αναφέρει το όνομα του σχήματος, τον τύπο χρόνου εκτέλεσης Java και τη διαφάνεια που το περιέχει. Για κελιά πίνακα, αναφέρει τις συντεταγμένες στήλης και σειράς (από το μηδέν) και τη διαφάνεια που τα περιέχει.
use aspose\slides\Presentation;
use aspose\slides\SlideUtil;
$presentation = new Presentation("presentation.pptx");
$arrayClass = new java_class("java.lang.reflect.Array");
try {
$textFrames = SlideUtil::getAllTextFrames($presentation, false);
$textFrameCount = java_values($arrayClass->getLength($textFrames));
for ($textFrameIndex = 0; $textFrameIndex < $textFrameCount; $textFrameIndex++) {
$textFrame = $textFrames[$textFrameIndex];
$ownerShape = $textFrame->getParentShape();
if (!java_is_null($ownerShape)) {
$shapeName = java_values($ownerShape->getName());
$shapeName = $shapeName === "" ? "(unnamed)" : $shapeName;
$shapeType = java_values($ownerShape->getClass()->getSimpleName());
$baseSlide = $ownerShape->getSlide();
$slideClassName = java_values($baseSlide->getClass()->getName());
if ($slideClassName === "com.aspose.slides.Slide") {
$slideLabel = "slide " . java_values($baseSlide->getSlideNumber());
} elseif ($slideClassName === "com.aspose.slides.NotesSlide") {
$slideLabel = "notes for slide " . java_values($baseSlide->getParentSlide()->getSlideNumber());
} else {
$slideLabel = java_values($baseSlide->getClass()->getSimpleName());
}
echo("Shape: " . $shapeName . "; type: " . $shapeType . "; " . $slideLabel . "\n");
continue;
}
$ownerCell = $textFrame->getParentCell();
if (!java_is_null($ownerCell)) {
$baseSlide = $ownerCell->getSlide();
$slideClassName = java_values($baseSlide->getClass()->getName());
if ($slideClassName === "com.aspose.slides.Slide") {
$slideLabel = "slide " . java_values($baseSlide->getSlideNumber());
} elseif ($slideClassName === "com.aspose.slides.NotesSlide") {
$slideLabel = "notes for slide " . java_values($baseSlide->getParentSlide()->getSlideNumber());
} else {
$slideLabel = java_values($baseSlide->getClass()->getSimpleName());
}
echo("Table cell: column " . java_values($ownerCell->getFirstColumnIndex()) . ", row " . java_values($ownerCell->getFirstRowIndex()) . "; " . $slideLabel . "\n");
continue;
}
echo("The text frame owner is not available as a shape or table cell.\n");
}
} finally {
$presentation->dispose();
}
Για περιεχόμενο SmartArt, επαναλάβετε τα σχήματα στο SmartArtNode::getShapes και αποκτήστε πρόσβαση σε κάθε SmartArtShape::getTextFrame. Το πλαίσιο κειμένου μπορεί να εντοπιστεί στο σχετικό σχήμα μέσω του TextFrame::getParentShape, ενώ το TextFrame::getParentCell επιστρέφει null. Συνεπώς, το κλαδί σχήματος στο παράδειγμα χειρίζεται επίσης κείμενο από κόμβους SmartArt.
Συλλογή Πληροφοριών Αντιστοίχησης με Κλήση Επιστροφής
Προωθήστε μια κλήση επιστροφής proxy Java σε μια μέθοδο επισήμανσης ή αντικατάστασης για να λάβετε ειδοποίηση για κάθε αντιστοίχηση. Η μέθοδος της κλήσης επιστροφής λαμβάνει το σχετικό πλαίσιο κειμένου, το πηγαίο κείμενο, το αντιστοιχισμένο κείμενο και τη θέση της αντιστοίχισης.
Η κλήση επιστροφής δεν λαμβάνει άμεσα τον αριθμό της διαφάνειας. Η παρακάτω υλοποίηση τον εξάγει από τη γονική διαφάνεια και επίσης διαχειρίζεται κείμενο που βρίσκεται στις σημειώσεις διαφάνειας. Ο πίνακας αποτελεσμάτων χρησιμοποιεί null όταν το κείμενο σχετίζεται με άλλο τύπο διαφάνειας.
class TextSearchCallback {
private $results = [];
public function getResults() {
return $this->results;
}
public function foundResult($textFrame, $sourceText, $foundText, $textPosition) {
$slideNumber = $this->getSlideNumber($textFrame);
$this->results[] = [
"textFrame" => $textFrame,
"sourceText" => java_values($sourceText),
"foundText" => java_values($foundText),
"textPosition" => java_values($textPosition),
"slideNumber" => $slideNumber
];
}
private function getSlideNumber($textFrame) {
$parentShape = $textFrame->getParentShape();
$parentCell = $textFrame->getParentCell();
if (!java_is_null($parentShape)) {
$parentSlide = $parentShape->getSlide();
} elseif (!java_is_null($parentCell)) {
$parentSlide = $parentCell->getSlide();
} else {
$parentSlide = $textFrame->getSlide();
}
if (java_is_null($parentSlide)) {
return null;
}
$parentSlideClass = $parentSlide->getClass();
$classNameValue = $parentSlideClass->getName();
$className = java_values($classNameValue);
if ($className === "com.aspose.slides.Slide") {
$slideNumber = $parentSlide->getSlideNumber();
return java_values($slideNumber);
}
if ($className === "com.aspose.slides.NotesSlide") {
$slide = $parentSlide->getParentSlide();
$slideNumber = $slide->getSlideNumber();
return java_values($slideNumber);
}
return null;
}
}
Δημιουργήστε ένα proxy για αυτό το αντικείμενο PHP πριν το περάσετε σε μια λειτουργία:
$callbackHandler = new TextSearchCallback();
$callbackInterface = java("com.aspose.slides.IFindResultCallback");
$callback = java_closure(
$callbackHandler,
null,
$callbackInterface
);
Για λειτουργίες αντικατάστασης, το foundText περιέχει το αρχικό αντιστοιχισμένο κείμενο, ώστε η κλήση επιστροφής μπορεί να καταγράψει ακριβώς ποιές λέξεις αντικαταστάθηκαν.
Επισήμανση Κειμένου
Χρησιμοποιήστε τη μέθοδο TextFrame::highlightText για να επισημάνετε αντιστοιχίσεις κυριολεκτικού κειμένου σε ένα πλαίσιο κειμένου. Προωθήστε το TextSearchOptions για να ελέγξετε την αναζήτηση.
Το παρακάτω παράδειγμα κώδικα επισημαίνει όλες τις εμφανίσεις των χαρακτήρων “try” και στη συνέχεια επισημαίνει μόνο τη λέξη “to” πλήρως.
$presentation = new Presentation("sample.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);
$callbackHandler = new TextSearchCallback();
$callbackInterface = java("com.aspose.slides.IFindResultCallback");
$callback = java_closure(
$callbackHandler,
null,
$callbackInterface
);
$substringSearchOptions = new TextSearchOptions();
$substringSearchOptions->setCaseSensitive(false);
$substringHighlightColor = new Java("java.awt.Color", 173, 216, 230);
// Επισήμανση κάθε εμφάνισης του "try" στο πλαίσιο κειμένου.
$shape->getTextFrame()->highlightText(
"try",
$substringHighlightColor,
$substringSearchOptions,
$callback
);
$wholeWordSearchOptions = new TextSearchOptions();
$wholeWordSearchOptions->setWholeWordsOnly(true);
$wholeWordSearchOptions->setCaseSensitive(false);
$wholeWordHighlightColor = new Java("java.awt.Color", 238, 130, 238);
// Επισήμανση μόνο της πλήρης λέξης "to".
$shape->getTextFrame()->highlightText(
"to",
$wholeWordHighlightColor,
$wholeWordSearchOptions,
$callback
);
foreach ($callbackHandler->getResults() as $result) {
echo(
"Found '" . $result["foundText"] . "' at position " .
$result["textPosition"] . " on slide " .
$result["slideNumber"] . ".\n"
);
}
$presentation->save("highlighted_text.pptx", SaveFormat::Pptx);
}
finally {
$presentation->dispose();
}
Το αποτέλεσμα:

Επισήμανση Κειμένου με Κανονικές Εκφράσεις
Η μέθοδος TextFrame::highlightRegex επισημαίνει τις αντιστοιχίες κειμένου που βρίσκονται μέσω κανονικής έκφρασης σε ένα πλαίσιο κειμένου.
Ο παρακάτω κώδικας επισημαίνει όλες τις λέξεις που περιέχουν επτά ή περισσότερους χαρακτήρες:
$presentation = new Presentation("sample.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);
$regex = java("java.util.regex.Pattern")->compile("\\b[^\\s]{7,}\\b");
$highlightColor = java("java.awt.Color")->YELLOW;
$shape->getTextFrame()->highlightRegex($regex, $highlightColor, null);
$presentation->save("highlighted_text_using_regex.pptx", SaveFormat::Pptx);
}
finally {
$presentation->dispose();
}
Το αποτέλεσμα:

Επισήμανση Κειμένου σε Όλη την Παρουσίαση
Χρησιμοποιήστε τα Presentation::highlightText και Presentation::highlightRegex για να αναζητήσετε όλα τα συναφή πλαίσια κειμένου σε μια παρουσίαση. Το παρακάτω παράδειγμα επισημαίνει έναν κυριολεκτικό όρο και όλες τις διευθύνσεις email:
$presentation = new Presentation("presentation.pptx");
try {
$searchOptions = new TextSearchOptions();
$searchOptions->setWholeWordsOnly(true);
$searchOptions->setCaseSensitive(false);
$termHighlightColor = java("java.awt.Color")->ORANGE;
$presentation->highlightText(
"confidential",
$termHighlightColor,
$searchOptions,
null
);
$patternClass = java("java.util.regex.Pattern");
$emailPattern = "\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b";
$emailRegex = $patternClass->compile(
$emailPattern,
$patternClass->CASE_INSENSITIVE
);
$emailHighlightColor = java("java.awt.Color")->YELLOW;
$presentation->highlightRegex($emailRegex, $emailHighlightColor, null);
$presentation->save("highlighted_presentation.pptx", SaveFormat::Pptx);
}
finally {
$presentation->dispose();
}
Αντικατάσταση Κειμένου σε Πλαίσιο Κειμένου
Χρησιμοποιήστε το TextFrame::replaceText για κυριολεκτικό κείμενο και το TextFrame::replaceRegex για αντικατάσταση βάσει προτύπου. Αυτές οι μέθοδοι ενημερώνουν το αντιστοιχισμένο κείμενο εντός του υπάρχοντος πλαισίου κειμένου, διατηρώντας τη μορφοποίηση των περιβάλλων τμημάτων αντί να ξαναδημιουργήσουν το πλαίσιο κειμένου από απλό κείμενο.
Το παρακάτω παράδειγμα σταθεροποιεί μια παραλλαγή ορθογραφίας και στη συνέχεια αντικαθιστά ετικέτες έκδοσης:
$presentation = new Presentation("presentation.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);
$searchOptions = new TextSearchOptions();
$searchOptions->setWholeWordsOnly(true);
$searchOptions->setCaseSensitive(false);
$shape->getTextFrame()->replaceText(
"colour",
"color",
$searchOptions,
null
);
$patternClass = java("java.util.regex.Pattern");
$versionPattern = "\\bv\\d+(?:\\.\\d+)*\\b";
$versionRegex = $patternClass->compile(
$versionPattern,
$patternClass->CASE_INSENSITIVE
);
$shape->getTextFrame()->replaceRegex(
$versionRegex,
"current version",
null
);
$presentation->save("updated_text_frame.pptx", SaveFormat::Pptx);
}
finally {
$presentation->dispose();
}
Αν μια αντιστοίχηση καλύπτει τμήματα με διαφορετική μορφοποίηση, ελέγξτε το αποτέλεσμα για να επιβεβαιώσετε ποια μορφοποίηση πρέπει να εφαρμοστεί στο κείμενο αντικατάστασης.
Αντικατάσταση Κειμένου σε Όλη την Παρουσίαση
Χρησιμοποιήστε τα Presentation::replaceText και Presentation::replaceRegex για να εφαρμόσετε τις ίδιες λειτουργίες σε όλη την παρουσίαση. Αυτό είναι χρήσιμο για τον καθαρισμό προτύπων, τις ενημερώσεις ορολογίας και τη διαγραφή.
$presentation = new Presentation("presentation.pptx");
try {
$searchOptions = new TextSearchOptions();
$searchOptions->setWholeWordsOnly(true);
$searchOptions->setCaseSensitive(true);
$presentation->replaceText(
"Contoso",
"Example Corp",
$searchOptions,
null
);
$accountNumberRegex = java("java.util.regex.Pattern")->compile(
"\\bACCT-\\d{6}\\b"
);
$presentation->replaceRegex(
$accountNumberRegex,
"ACCT-REDACTED",
null
);
$presentation->save("updated_presentation.pptx", SaveFormat::Pptx);
}
finally {
$presentation->dispose();
}
Ομαδοποίηση Αντιστοιχίσεων για Αναφορές
Καθώς κάθε αποτέλεσμα αποθηκεύει τον αριθμό της διαφάνειας και το πλαίσιο κειμένου, οι εφαρμογές μπορούν να ομαδοποιούν τις αντιστοιχίσεις για ελεγκτικούς, αναφορικούς ή ελεγκτικούς κύκλους εργασίας. Το παρακάτω παράδειγμα ομαδοποιεί τα συλλεγμένα αποτελέσματα πρώτα ανά διαφάνεια και στη συνέχεια ανά πλαίσιο κειμένου:
$matchesBySlide = [];
$systemClass = java("java.lang.System");
foreach ($callbackHandler->getResults() as $result) {
$slideNumber = $result["slideNumber"];
$slideLabel = $slideNumber === null ? "Other" : (string) $slideNumber;
$textFrame = $result["textFrame"];
$textFrameHash = $systemClass->identityHashCode($textFrame);
$textFrameKey = (string) java_values($textFrameHash);
if (!isset($matchesBySlide[$slideLabel])) {
$matchesBySlide[$slideLabel] = [];
}
if (!isset($matchesBySlide[$slideLabel][$textFrameKey])) {
$matchesBySlide[$slideLabel][$textFrameKey] = [
"textFrame" => $textFrame,
"matches" => []
];
}
$matchesBySlide[$slideLabel][$textFrameKey]["matches"][] = $result;
}
foreach ($matchesBySlide as $slideLabel => $textFrameGroups) {
echo("Slide: " . $slideLabel . "\n");
foreach ($textFrameGroups as $textFrameGroup) {
$textFrame = $textFrameGroup["textFrame"];
echo(" Text frame: " . $textFrame->getText() . "\n");
foreach ($textFrameGroup["matches"] as $result) {
echo(
" '" . $result["foundText"] . "' at position " .
$result["textPosition"] . "; context: '" .
$result["sourceText"] . "'\n"
);
}
}
}
Συχνές Ερωτήσεις
Πώς μπορώ να αναζητήσω μόνο ένα πλαίσιο κειμένου αντί για ολόκληρη την παρουσίαση;
Αποκτήστε το πλαίσιο κειμένου του σχήματος και καλέστε το TextFrame::highlightText, το TextFrame::highlightRegex, το TextFrame::replaceText ή το TextFrame::replaceRegex σε αυτό το πλαίσιο κειμένου. Οι μέθοδοι σε επίπεδο παρουσίασης επεξεργάζονται όλα τα συναφή πλαίσια κειμένου.
Πώς μπορώ να αντιστοιχίσω πλήρεις λέξεις με τη σωστή κεφαλαία/μικρά;
Ορίστε τα TextSearchOptions::setWholeWordsOnly και TextSearchOptions::setCaseSensitive σε true και προωθήστε τις επιλογές σε μια μέθοδο επισήμανσης ή αντικατάστασης κυριολεκτικού κειμένου. Για κανονικές εκφράσεις, καθορίστε τα όρια λέξεων και τη διάκριση κεφαλαίων/μικρών μέσα στο Java Pattern ίδιο του.
Μπορεί η αναζήτηση και η αντικατάσταση να περιλαμβάνει κείμενο στις σημειώσεις διαφάνειας;
Ναι. Ορίστε το TextSearchOptions::setIncludeNotes σε true όταν χρησιμοποιείτε μια λειτουργία κυριολεκτικού κειμένου σε επίπεδο παρουσίασης.
Πώς μπορώ να δημιουργήσω μια αναφορά χωρίς να σαρώσω τη παρουσίαση δεύτερη φορά;
Προωθήστε μια κλήση επιστροφής proxy Java στην λειτουργία επισήμανσης ή αντικατάστασης. Λαμβάνει κάθε αντιστοίχηση κατά τη διάρκεια της λειτουργίας, ώστε η εφαρμογή να μπορεί να αποθηκεύσει το πηγαίο κείμενο, το αντιστοιχισμένο κείμενο, τη θέση, το πλαίσιο κειμένου και τον προκύπτοντα αριθμό διαφάνειας για μετέπειτα ομαδοποίηση ή εξαγωγή.
Διατηρεί η αντικατάσταση κειμένου τη μορφοποίησή του;
Οι μέθοδοι TextFrame::replaceText και TextFrame::replaceRegex τροποποιούν το αντιστοιχισμένο κείμενο εντός του υπάρχοντος πλαισίου κειμένου και διατηρούν τη μορφοποίηση των περιβάλλοντων τμημάτων. Εάν μια αντιστοίχηση καλύπτει τμήματα με διαφορετική μορφοποίηση, εξετάστε το αποτέλεσμα ώστε η αντικατάσταση να χρησιμοποιεί το επιθυμητό στυλ.